我的应用程序使用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