我正在编写一个网络应用程序。 并且在线程竞争条件方面存在一些问题。
“cd”是套接字描述符。 我的线程之一检索套接字描述符 并通过套接字发送一些数据。
假设map_sd返回5。 然而另一个线程可能会关闭套接字 5 并且 重新分配另一个。这会破坏程序的逻辑。
// wait until there is valid descriptor mapping
while( !(cd = map_sd( sd )) ){
sleep(1);
}
// forward PAYLOAD header
if( send(cd, &payload, sizeof(PAYLOAD), MSG_NOSIGNAL) < 0 ){
printf("send fail 813\n");
}
我想要的是使上面的代码“原子” 当我在linux中使用pthread库时我该如何做到这一点?
提前谢谢您。
请您参考如下方法:
您需要一个条件变量和一个互斥锁:
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
在线程中传递cd:
pthread_mutex_lock(&lock);
/* here you pass cd through a data structure or whatever */
pthread_cond_signal(&cond);
pthread_mutex_unlock(&lock);
在等待cd的线程中:
pthread_mutex_lock(&lock);
if (pthread_cond_wait(&cond, &lock) != 0) {
/* handle error */
}
/* here you can acquire cd */
pthread_mutex_unlock(&lock);
应该就是这样 - 您使用条件变量和锁进行独占访问,并通知其他线程资源现在可用。 pthread_cond_wait()
释放锁以等待,并在其他线程通过 pthread_cond_signal()
通知后重新获取该锁。
编辑:格式化。