c++ - Apache Thrift,线程安全的 TSimpleServer stop() 调用

标签 c++ synchronization thread-safety thrift

我正在使用 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
}

难道运行 serve() 的线程可以从 TSimpleServer 的未 protected stop_ 属性读取而来自 stop() 的线程正在写入它吗?

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

最佳答案

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

关于c++ - Apache Thrift,线程安全的 TSimpleServer stop() 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13828000/

相关文章:

c++ - CUDA 中 3D 三角网格的最佳内存数据结构是什么?

c++ - 当一个功能完成另一个功能打开时我该怎么办?

c++ - 三次贝塞尔曲线实现

windows - 无需锁定的优雅文件读取

安卓 : How to restrict disable sync

java - 即使在一个命令中也会出现线程并发问题吗?

java - 工作完成后我应该停止线程吗?

c++ - 嵌套的命名空间和不明确的符号

c++ - 事件对象和条件变量的区别

multithreading - 响应式(Reactive)扩展 OnNext 线程安全