0

在我的问题中,我使用 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 会不会看到我的主线程在读取调用阻塞之前更新“完成”的值?

4

1 回答 1

0

在一个线程中写入变量并在另一个线程中读取它需要同步(例如互斥锁)以避免竞争条件。

如果这是一个真正的套接字而不是一个奇怪的对象,请考虑调用shutdown()以断开连接并唤醒阻塞的线程,同时保持文件描述符有效,请参阅Wake up thread blocked on accept() call。一旦读取失败,myThread 将锁定互斥体并检查 done 变量。

其他方法包括调用poll()套接字和用于传递关闭消息的管道。

于 2012-07-07T22:42:16.910 回答