如何在抛出异常时处理共享数据
当多个线程使用共享数据时,如何在抛出异常时正确处理数据的销毁?如何在抛出异常时处理共享数据
我正在研究一个应用程序,我希望一个进程在等待从另一个进程通过网络发送的结果的同时进行工作。我实现创建一个线程等待结果一类,像下面的(实际的代码太大,张贴在这里,所以这是一个小例子):
class Notifier { public:
Notifier(Client* _client) : value(-1), client(_client) {
listener = boost::thread(&Notifer::Listen, this);
}
void Listen() {
try {
int rec = client->Receive(); //blocking call to receive data over a socket
boost::scoped_lock sl(mutex);
value = rec;
} catch (...) {
cout << "Exception thrown in listener" << endl;
}
}
int Get() {
boost::mutex::scoped_lock sl(mutex);
return value;
}
private:
int value;
boost::mutex;
boost::thread listener;
Client* client;
}
int main() {
Client client; //initialize client, connect, etc.
Notifier n(client);
while(n.Get() < 0) {
// do work
cout << "Waiting for data" << endl;
sleep(1);
}
}
这工作对我很好,直到我添加异常处理:
int main() { try {
Client client; //initialize client, connect, etc.
Notifier n(client);
while(n.Get() < 0) {
// do work
cout << "Waiting for data" << endl;
sleep(1);
throw exception();
}
} catch(...) {
cout << "Exception thrown in main" << endl;
}
return 0;
}
我得到的错误
“助推:互斥锁的pthread_mutex_lock中失败:无效的参数”。
我的猜测是,抛出异常时,main
函数的堆栈被解开,破坏了互斥锁。然后Listen
函数中的Receive()
调用返回并且scoped_lock
构造函数试图锁定不存在的互斥体,从而导致错误。
有人可以证实这确实是怎么回事?如果是这样,是否有一种方法可以与线程通信:互斥体不再存在或线程应该终止?还是有更多的异常安全的做我想做的事情?
回答:
你必须为Notifier
类编写一个正确的析构函数,它将取消所有阻塞的调用(即解除阻塞client->Receive()
),然后终止listener
线程。您还需要修改Notifier::Listen()
来定期检查线程终止请求...然后一切都会好的。
以上是 如何在抛出异常时处理共享数据 的全部内容, 来源链接: utcz.com/qa/261161.html