我是c ++的新手,研究应该是一个非常基本的文件读取,然后处理数据功能,我一直坚持能够至少为另一个提供线程的“状态”,以便数据可以消耗。这可能是我忽略的一些非常基本的东西 - 可以使用一些有关在c ++中使用pthreads的见解。
Bellow是一些基本的提取代码,功能正常,读取文件并提供要处理的数据。另一个处理数据的线程需要知道这个数据的状态。 什么是最好的策略?我试图通过另一个线程的函数请求线程的状态,但收到不正确的响应。
Reader::Reader(){
_threadId = 1;
_msg = NONE; // enum NONE, READ, STOP
active = false;
pthread_mutex_init(&_mutex, 0);
}
Reader::~Reader(){
pthread_mutex_destroy(&_mutex);
}
void Reader::read(){
_msg = READ;
active = true;
pthread_create(&_threadId, 0, work, this);
}
void * Reader::work(void *myselfreader){
Reader * reader = (Reader*)myselfreader;
reader->loop();
pthread_exit(0);
return 0;
}
void Reader::loop(){
while(active){
pthread_mutex_lock(&_mutex);
switch(_msg){
case READ:
// do the reading of the IO file - which works fine
// once done reading the file - the _msg is set to STOP
break;
case STOP:
stopThread();
break;
default:
break;
}
pthread_mutex_unlock(&_mutex);
}
return;
}
void Reader::stopThread(){
active = false;
_msg = ENC_NONE;
pthread_join(_threadId, 0);
}
/*****************/
int Reader::getReaderState(){
// another thread needs to know the state of this thread
//
return _msg // ??
return active // ??
}
答案 0 :(得分:0)
您的代码中似乎有某种竞争条件。
您需要使用互斥锁保护_msg
变量。每次需要更新_msg
变量请求互斥锁时,请更新变量并关闭互斥锁。您需要对getReaderState()
函数中的读取执行相同的操作 - 获取互斥锁,将变量复制到temp,释放互斥锁并返回临时变量。
为了方便和容易出错使用,您应该创建getter和setter函数来访问_msg
字段,该字段将由相同的互斥锁(而不是您已使用的互斥锁)保护:
void setMsg(int msg)
{
pthread_mutex_lock(&msg_mutex);
_msg = msg;
pthread_mutex_unlock(&msg_mutex);
}
int getMsg()
{
int tmp;
pthread_mutex_lock(&msg_mutex);
tmp = _msg;
pthread_mutex_unlock(&msg_mutex);
return tmp;
}