这个接口是线程安全的吗?
Is this interface thread-safe?
我想做一个控制循环接口。
具有should_stop()
方法来检查循环是否应该断开或继续。
它确实侦听SIGINT
信号(Ctrl+C),并且在它获得should_stop()
信号后方法返回True。
现在看来这个接口工作正常了。
但是我不确定这个接口是线程安全的。
<标题> LoopInterface.h文件#include "signal.h"
#include "pthread.h"
#define LOCK(mutex) pthread_mutex_lock(&mutex)
#define UNLOCK(mutex) pthread_mutex_unlock(&mutex)
class LoopInterface {
public:
LoopInterface(){
LOCK(_lock_is_signal_registered);
bool temp = _is_signal_registered;
UNLOCK(_lock_is_signal_registered);
if(!temp)
{
register_signal();
}
}
bool should_stop()
{
LOCK(_lock_should_stop);
bool temp = _should_stop;
UNLOCK(_lock_should_stop);
return _should_stop;
}
private:
static void register_signal()
{
LOCK(_lock_is_signal_registered);
_is_signal_registered = true;
UNLOCK(_lock_is_signal_registered);
signal(SIGINT, &LoopInterface::signal_handler);
}
static void signal_handler(int sig){
LOCK(_lock_should_stop);
_should_stop = true;
UNLOCK(_lock_should_stop);
}
static bool _should_stop;
static bool _is_signal_registered;
static pthread_mutex_t _lock_should_stop, _lock_is_signal_registered;
};
<标题> LoopInterface.cpp文件#include "LoopInterface.h"
bool LoopInterface::_should_stop = false;
bool LoopInterface::_is_signal_registered = false;
pthread_mutex_t LoopInterface::_lock_should_stop;
pthread_mutex_t LoopInterface::_lock_is_signal_registered;
这就是它的用法。
/************Threads*************/
#include "LoopInterface.h"
class A : public LoopInterface{
};
void threadX(){
A a;
while(!a.should_stop()){
//do something...
}
}
你能告诉我这个接口是线程安全的吗?或不呢?
如果没有,是什么问题?
<标题> 附加问题我的同步代码还有一个问题。
由于在signal_handler
中调用pthread_mutex_lock
而should_stop
方法正在锁定同一个mutex
,因此经常发生死锁。
我发现一篇文章指出线程相关的函数不应该在信号处理程序中调用。
我想我应该找另一种方法来同步我的成员变量
标题>标题>标题>显然,这段代码不是线程安全的:变量_should_stop
由某个不受控制的线程中的信号设置,并在运行自己线程的LoopInterface
中读取。根本没有同步。这种方法只有在只有一个线程的情况下才是线程安全的。
static std::atomic<bool> _should_stop;
由于此时您对任何其他值都不感兴趣,因此可以读取带有std::memory_order_relaxed
标志的变量。
如果LoopInterface
的构造函数是从多个线程调用的,那么当然也需要同步访问_is_signal_registered
。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 如何将元素添加到数组的线程安全函数?
- C++中的线程安全删除
- 在std::thread中,joinable()然后join()线程安全吗
- 在c++队列中使用pop和visit实现线程安全
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 全局变量 多读取器 一个写入器多线程安全?
- 共享队列的线程安全
- boost::文件系统::recursive_directory_iterator多线程安全
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 以线程安全的方式转换 C/C++ 中时区名称字符串的时区偏移量
- 线程安全运算符<<
- 如何使缓存线程安全
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 提升精神 V2 Qi 语法线程安全吗?
- 线程调用的函数对对象删除是否安全?
- asio 链对象线程安全吗?
- 线程安全队列 c++
- 提供对不同类型的数据(建议、代码审查)的线程安全访问的类
- 有没有更好的方法可以使此代码线程安全?线程局部静态似乎是一个生硬的工具