1

我想我面临着比赛条件的问题,但不确定。以下是我的代码。

while(1) 
{
    int newsocket_fd; = accept(socket_fd,(struct sockaddr *) &client_addr, &client_len);

    if (newsocket_fd < 0) 
    {
          perror("Error on accept");
    }
    else
    {
        pthread_create( &threadNewClient, NULL, NewClient, (void *)&newsocket_fd);
    }
}

我将 int 变量(newsocket_fd)的地址作为线程参数发送。

void* NewClient(void * thread_args)
{
    int client_socket = *(int*)thread_args;
    char buffer[256];   
    int n;
    stringstream userInput,responseString; 

    printf(KBLU "Client conneted  %d\n",client_socket);
}

在这里,我正在接收线程参数并对其进行类型转换。当我打印(或使用)它的值时,它大部分时间都会给出发送到先前线程(相同线程函数)的值。我在网上搜索,有人认为这是因为比赛条件。

当我发送值而不是地址作为参数时,它工作正常。我正在访问具有不同值的相同地址,它怎么可能是竞争条件。

提前致谢。

@Edit:创建 int newsocket_fd; 在while循环里面。

4

2 回答 2

7

因为您发送的是位于堆栈的整数 ( newsocket_fd) 的地址。这将在下次接受套接字时被重用。只发送整数值有什么问题?

于 2013-06-19T09:49:12.360 回答
3

newsocket_fd在新线程从您给它的指针中读取它之前,可能会被修改(或更糟的是,销毁并重新创建)。这绝对是一个竞争条件。

最简单的解决方法就是不在线程之间共享相同的变量。如果您出于某种原因绝对必须这样做,那么您必须确保在线程完成读取它之前不会修改它,使用一些同步对象(条件)。

于 2013-06-19T09:48:20.470 回答