它如何成为一种竞争条件。或者我的代码有问题

时间:2013-06-19 09:45:04

标签: c++ c linux multithreading pthreads

我认为我面临种族问题,但不确定。 以下是我的代码。

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;在循环中。

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

在新线程从你给它的指针读取它之前,可以修改

newsocket_fd(或者更糟,销毁并重新创建)。这绝对是一场竞争。

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