我的應用程序使用CreateThread
創建輔助(只)線程來執行每10ms
,像下面僞:Win32線程
map<string, int32_t> a_map;
DWORD WINAPI Table::manual_action_execute_thread(LPVOID lpParameter) {
while(Table::manual_action_execute_thread_run) {
...
if (!Table::automatic_action_execute_inprogress) {
...
}
...
if (a_map["blah"] == 0) {
...
}
...
Sleep(10);
}
return 0;
}
的變量聲明如下:
static volatile bool manual_action_execute_thread_run;
static volatile bool automatic_action_execute_inprogress;
在開始我的線程之前,第一個取值爲true
,所以我不使用鎖定。第一個需要false
。
我使用::automatic_action_execute_inprogress
來控制秒線程其中只有主線程上改變一些行爲。
問題(S):
1)因爲我只在主線程更新::automatic_action_execute_inprogress
,只是讀它秒線程我還需要首先使用EnterCriticalSection
鎖呢?或者鎖定僅限於在兩個線程上更改的共享變量?
2)那麼<map>
用在多個線程上,並且只用一個修改呢?當然,我必須鎖定它EnterCriticalSection
每當變化,但如何read
訪問?我是否應該鎖定它當我從它讀取(如if (a_map["foo"] == 0)
)如果可以改變,甚至通過一個單一的線程?像這樣的例子?
EnterCriticalSection(&cs);
bool val = a_map["foo"];
LeaveCriticalSection(&cs);
if (val == 0) {
...
}
變量必須定義爲原子變量,否則您需要鎖定它,否則你會得到未定義的行爲,由於數據競賽。限定符volatile不會**使可變原子。 – 2501
@ 2501,感謝您的評論。當我改變它們時,我將關鍵部分的變量鎖定。那麼在多個線程上使用「
您將不得不瞭解數據競賽是什麼。本網站提供的資源。 – 2501