您好,登錄后才能下訂單哦!
本篇內容介紹了“c++的mutex怎么用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
面臨的問題
多線程同時操作一段數據時,線程調度由操作系統控制,在機器碼層次進行,所以訪問同一數據的多個任務(線程)的代碼隨機交替執行,從而導致任務(線程)間數據交換不能正常進行。
解決問題的方式
問題搞清楚以后,對策當然就是保證每個線程內操作數據的處理的完整性。但是C/C++中達成這個目標的手段不是將數據保護起來,而是限制操作數據的代碼的同時執行。具體說,就是在開始執行操作數據的代碼之前先通過mutex::lock方法鎖定互斥量,然后執行對數據進行操作的代碼。數據操作代碼執行完了之后,再通過mutex::unlock釋放互斥量。在互斥量的鎖定期間其他線程無法鎖定信號量。
由于操作系統可以保證同一時刻只有一個線程可以鎖定成功,所以只要程序在所有操作同一數據的代碼之前都有鎖定互斥量的動作,結果上就可以保證同一時刻只有一段操作數據的代碼可以執行,而不被其他操作改數據的代碼打斷。這樣就間接保證了數據的完整性。
注意事項
根據上面的描述,可以知道,使用Mutex進行數據交互必須遵循以下原則:
所有操作數據的代碼在執行之前必須首先嘗試鎖定同一個互斥量
只有在互斥量鎖定成功的情況下才允許執行操作數據的代碼
操作數據的代碼執行以后,必須釋放互斥量
如果在操作數據之前沒有鎖定互斥量的過程,或者鎖定的是不同的互斥量,無論哪一種情況都達成不了同一時刻,只有一段代碼執行的目標。
如果操作數據的代碼執行之后沒有釋放互斥量,后續處理數據的代碼將永遠不能鎖定互斥量,也就是說,后續的數據處理不能繼續執行。
請按照上述原則在審視一下代碼,主要關注mutex:
QMutex mutex;
//define CreateDataTask class.
class CreateDataTask : public QThread
{
public:
CreateDataTask(QMutex& mutex)
:m_mutex(mutex)
{
}
private:
QMutex& m_mutex;
void run()
{
for(int i = 0; i < 10; ++i)
{
m_mutex.lock();
cout << "WT:<<<<WriteData:" << i
<< "<<<<" << endl;
WriteData();
m_mutex.unlock();
}
}
};
::timeBeginPeriod(1);
//Create thread object of CreateDataTask.
CreateDataTask *writer = new CreateDataTask(mutex);
//Start Thread.
writer->start(QThread::NormalPriority);
for(int i = 0; i < 10; ++i)
{
mutex.lock();
cout << "RT:>>>>ReadData:" << i
<< ">>>>" << endl;
ReadData();
data_array.clearData();
mutex.unlock();
}
timeEndPeriod(1);
應該講點原則
有一種說法,飛機是試飛員飛出來的,估計也會有很多人說,程序是程序員Debug出來的。這種觀點作者實在是不敢茍同。多任務編程就是一個不能靠調試解決問題的例子。必須遵循上面的原則,否則的話程序的動作會有很大的不確定性。在開發的最后階段,多任務相關的問題都會占有相當大的比例。那簡直就是程序員的噩夢。
“c++的mutex怎么用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。