Win32线程

vlzvl

我的应用程序用来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>在多个线程上使用并且仅被一个线程修改的a怎么样当然,EnterCriticalSection无论何时更改,我都必须锁定它,read访问权限又如何呢?当我从中读取内容(例如if (a_map["foo"] == 0))时是否可以通过单个线程进行更改,是否应该将其锁定例如这样?

EnterCriticalSection(&cs);
   bool val = a_map["foo"];
LeaveCriticalSection(&cs);

   if (val == 0) {
      ...
   }
迈克·纳基斯(Mike Nakis)

由于仅在一个线程中更新变量,而在其他线程中读取变量,并且由于变量的类型是atomic,因此不需要任何锁定机制。您需要做的就是声明它volatile,您已经完成了。如果变量是非原子类型的(例如,map在32位体系结构上为,甚至只是64位整数),则需要锁定。

C&C ++标准甚至在简单的机器语言操作(例如读取an)上也不假定操作的原子性int,但是如果您使用的winapi是on x86,则可以保证操作的原子性(因此,如果您想编写可移植的代码,即使您int在一个线程上编写一个并且仅从其他线程读取它,也请使用锁定。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Win32,MFC:结束线程

来自分类Dev

正确使用Win32线程

来自分类Dev

Win32程序应始终为多线程吗

来自分类Dev

为什么Win32没有僵尸线程问题?

来自分类Dev

是否在Win32中模拟每个线程?

来自分类Dev

Win32程序应始终为多线程吗

来自分类Dev

为什么Win32没有僵尸线程问题?

来自分类Dev

Win32的Cortana

来自分类Dev

win32 ExportAsFixedFormat

来自分类Dev

Win32 API InterlockedIncrement在多线程编程中的意外结果

来自分类Dev

如何使用Win32 API获取任何线程的堆栈大小和堆栈限制

来自分类Dev

Win32函数可以在同一线程上异步运行吗?

来自分类Dev

Win32计时器是否归其调用线程所有?

来自分类Dev

ruby MS Windows gem:win32 / daemon:Service_Main线程异常退出

来自分类Dev

为什么在线程化时win32消息循环停止工作?

来自分类Dev

加入线程的按钮导致win32 / winAPI应用程序冻结

来自分类Dev

C ++如何使用Win32 API通过线程从文本框中获取文本

来自分类Dev

如何使用Win32 API获取任何线程的堆栈大小和堆栈限制

来自分类Dev

Win32 mkdir与_mkdir

来自分类Dev

Python Win32:错误

来自分类Dev

GetMenuBarInfo()Win32函数

来自分类Dev

C ++,Win32错误

来自分类Dev

使用Win32线程模型时,MinGW-w64是否开箱即用地支持std :: thread?

来自分类Dev

C++/Win32 - 如何迭代特定进程的线程列表并将起始地址解析为模块?

来自分类Dev

字体布局算法,Win32

来自分类Dev

GetGuiResources WIn32 API使用

来自分类Dev

无法安装Python win32库?

来自分类Dev

什么是Win32消息编组?

来自分类Dev

崩溃调试Win32 App