【发布时间】:2013-07-26 05:01:53
【问题描述】:
当有多个线程使用共享数据时,当抛出异常时如何正确处理该数据的销毁?
我正在开发一个应用程序,我希望一个进程在等待通过网络从另一个进程发送的结果时工作。我实现了一个类,它创建一个线程来等待结果,如下所示(实际代码太大,此处无法发布,所以这是一个小例子):
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构造函数尝试锁定不存在的互斥体,导致错误。
有人可以确认这确实是正在发生的事情吗?如果是这样,有没有办法与线程通信互斥锁不再存在或线程应该终止?还是有一种更安全的方式来做我想做的事情?
【问题讨论】:
标签: c++ multithreading boost exception-handling local-variables