在我的问题中,我使用pthread_create()创建一个pthread,比如myThread。
它们共享主线程的公共变量“done”,告诉myThread停止从套接字读取。
在我的pthread中,我有一个循环:
// done is a common variable
while (!done && socket->read(&buffer) == OK) {
// do something....
}
有时候,我想告诉myThread停止从套接字读取,所以我这样做:
done = true;
void *test;
pthread_join(myThread, &test);
这会导致竞争条件吗?也就是说myThread看不到我的主线程在读取调用阻塞之前更新了'done'的值?
答案 0 :(得分:0)
在一个线程中编写变量并在另一个线程中读取变量需要同步(例如互斥锁)以避免竞争条件。
如果这是一个真正的套接字而不是一个奇怪的对象,请考虑调用shutdown()
来拆除连接并唤醒被阻塞的线程,同时保持文件描述符有效,请参阅Wake up thread blocked on accept() call。一旦读取失败,myThread就会锁定互斥锁并检查done变量。
其他方法包括在套接字上调用poll()
和用于传递关闭消息的管道。