簡體   English   中英

C ++,多線程環境中的全局數據行為

[英]Global data behaviour in Multi-thread environment, C++

我有一個運行三個線程的應用程序。 這三個線程都基於全局變量的狀態進行一些操作。 其中兩個線程正在運行同一段代碼,而一個線程正在運行另一段代碼。

例如:

全局變量的初始值為false

gGlobalVarLock = false;

thread 1:
while(true == gGlobalVarLock)
{
  /*wait for flag to become false*/
}
/*after the flag becomes false*/    
{
  mutex.lock();
  gGlobalVarLock = true;

  /*run some code*/

  gGlobalVarLock = false;
  mutex.unlock();
}

thread 2 and 3,    
while(true == gGlobalVarLock)
{
  /*wait for flag to become false*/
}
/*after the flag becomes false*/
{
  mutex.lock();
  gGlobalVarLock = true;

  /*run some other code*/

  gGlobalVarLock = false;
  mutex.unlock();
}

現在,由於gGlobalVarLock的初始false值啟動了應用程序之后,其中一個線程開始執行,並應鎖定其他線程以使其無法執行。 根據我的理解,上述實現可以某種方式確保gGlobalVarLock被執行線程鎖定,並且一旦執行了特定線程的Mutex.lock()下的代碼,其他線程就無法訪問它。 看起來它也在鎖定全局變量。 但是我不知道如何。

我的代碼似乎運行良好。 但是我有一個疑問。 互斥鎖將鎖定線程2和3的代碼,因為這兩個線程使用同一段代碼來執行。 但是對於正在運行其他代碼的線程1,鎖定如何工作? 該線程中的Mutex.lock()是否確保gGlobalVarLock在執行其Mutex.lock()下的代碼時被其他線程鎖定。 該互斥鎖是否確保gGlobalVarLock不會在運行其他代碼的其他線程中更改? 我的理解是Mutex.lock()鎖定不同線程使用的通用代碼。 那么,在不同線程運行不同代碼的情況下,如何鎖定全局變量。

Mutex.lock()是否在多線程環境中鎖定全局變量?

關鍵是,如果您在父進程中創建一個互斥對象並在多個線程之間共享,則該對象的內存將由線程共享(不是進程的線程)

如果您改為創建進程(使用fork() ),則會復制內存並且它將無法正常工作。

但是在線程之間,內存是共享的,因此對象是共享的。 您的所有線程在內存中只有一個mutex實例。

該對象將確保一次僅一個線程正在訪問位於lockunlock調用之間的關鍵部分。

簡而言之,您的代碼就可以了。

互斥鎖確保在lock()之后,僅獲取該互斥鎖的線程才能執行代碼,直到到達unlock()調用為止。 除非您的代碼非常慢,否則您可以認為它正在同時執行。 但是,每次只由一個線程執行lock()unlock()之間的代碼塊。

互斥鎖不會鎖定變量,而只會鎖定自身。 通過限制對互斥量后面的變量的訪問,可以保護該變量,但是如果該變量是全局變量,則不能保證您在代碼的其他位置可能會無意間訪問它而無需通過互斥量。

例如,在您的代碼中,沒有人使用互斥體,直到他們已經訪問了全局變量並且發現它為false。 因此,這三個線程完全有可能爭奪互斥鎖。

在您的示例中,全局變量似乎是多余的,您似乎正在將其用作過濾器以保護對互斥量的訪問。

您可能正在尋找一種稱為條件變量的東西來與您的互斥鎖一起使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM