0

我正在编写一个网络应用程序。并且有一些关于线程竞争条件的问题。

“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 库时我该怎么做?

先感谢您。

4

1 回答 1

0

您需要一个条件变量和一个互斥锁:

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()

编辑:格式化。

于 2013-02-01T20:00:33.020 回答