[英]Win32 threading
我的应用程序使用CreateThread
创建一个每10ms
执行一次的辅助(也是唯一)线程,如下面的伪代码:
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
来控制仅在主线程上更改的第二个线程上的某些行为。
问题):
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) {
...
}
由于您只在一个线程中更新您的变量并在其他线程中读取它,并且由于变量的类型是atomic ,因此您不需要任何锁定机制。 您需要做的就是将它声明为volatile
,您已经完成了。 如果变量是非原子类型(例如, map
,或者甚至只是 32 位体系结构上的 64 位整数),那么您将需要锁定。
即使在读取int
等简单的机器字操作上,C 和 C++ 标准也不假定操作的原子性,但如果您使用的是winapi
那么您使用的是x86
,这保证了它。 (因此,如果您想编写可移植代码,即使您在一个线程上编写int
并且仅从其他线程读取它,也要使用锁定。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.