【发布时间】:2016-10-19 14:07:01
【问题描述】:
我在 C++11 之前工作,否则我只会使用包含线程和原子变量来满足我的需求,但是,不能这样做。有一个类,当实例化时会启动多个线程。在一个线程启动的函数中,我有类似的东西:
void ThisClass::ThisThread()
{
while (runThisThread)
{
// doing stuff
}
}
另外一个函数是:
void ThisClass::StopThisThread()
{
runThisThread = false; // 'runThisThread' variable is 'volatile bool'
}
一个线程将根据从另一个线程分配的索引来咀嚼缓冲区。因此,一个线程会分配一个值,而另一个线程除了读取该值外永远不会做任何事情。我的计划是使用更易失的内存来分配这些索引值。但是,这个问题表明我错误地使用了易失性内存When to use volatile with multi threading?。在 C++11 之前处理这样的多线程类中的内存的正确方法是什么?请记住,我不允许多个线程分配单个变量,而每个线程都可以读取该变量。
编辑:忘了包括这是一个不需要跨平台的 Windows 程序。我正在使用 afxwin.h AfxBeginThread() 进行线程处理。
【问题讨论】:
-
您需要原子变量或互斥体。我把它作为练习留给 OP 来研究它们。
-
使用您使用的线程 API 中的互斥锁。
-
你使用的 API 应该有一些教程。应该在某处提到互斥锁或同步机制
-
由于线程不是 C++ 98 的一部分,因此您必须为此使用库,例如 pthreads。该库还将提供用于同步和内存屏障的设施。使用这些。
-
Microsoft 扩展
volatile以适应线程间类似原子的值共享,因此声明runThisThreadvolatile应该做你想做的事,只要bool值可以“复制”在一条硬件指令中”,并且您正在使用/volatile:ms选项(非 ARM 架构的默认值)进行编译。见:msdn.microsoft.com/en-us/library/12a04hfd.aspx
标签: c++ windows multithreading mfc c++03