【发布时间】:2015-08-23 11:27:06
【问题描述】:
我想做一个控制循环界面。
它有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,因此经常发生死锁。
我发现了一个article 声明不应在信号处理程序中调用与线程相关的函数。
我想我应该找到另一种方法来同步我的成员变量。
【问题讨论】:
标签: c++ multithreading thread-safety