0

我正在使用 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_ 属性中读取?

由于某种原因我忽略了这不是问题吗?任何有关同步的帮助将不胜感激。

4

1 回答 1

1

这不应该是一个问题。对适合处理器字(4 或 8 个字节)的属性对齐变量的任何写入都是原子的。换句话说,当另一个线程正在写入它时,不可能读取它的值。所以,代码是完全正确的。

于 2012-12-12T08:20:15.630 回答