我正在使用Thrift框架来处理几个应用程序之间的IPC。
我想要解决一个轻微的竞争条件问题,但是这个解决方案也出现了一个线程安全问题。
TSimpleServer(Thrift代码)的代码如下所示:
void TSimpleServer::serve()
{
// ...
while(!stop_) { // ... }
}
void TSimpleServer::stop()
{
stop_ = true;
// ...
}
因此,如果我启动一个运行此功能的新线程:
void workerFunction()
{
// server is of type TSimpleServer
server.serve(); // blocks here
}
尝试从不同的线程中停止它:
void StopServer()
{
server.stop(); // called from a separate thread
}
当来自stop()的线程写入它时,运行serve()的线程是否可以从TSimpleServer的不受保护的stop_属性读取?
由于某种原因,我忽略了这个问题吗?任何有关同步的帮助都将非常感激。
答案 0 :(得分:1)
这应该不是问题。对属于处理器字(4或8字节)的属性对齐变量的任何写入都是原子的。换句话说,当另一个线程写入它时,不可能读取它的值。所以,代码是完全正确的。