我正在编写一个网络应用程序。 并且在线程竞争条件方面存在一些问题。

“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() 通知后重新获取该锁。

编辑:格式化。


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!