这怎么可能是竞态条件.或者是我的代码有问题

How it can be a race condition. Or it is something wrong with my code

本文关键字:或者是 我的 代码 有问题 条件 怎么可能      更新时间:2023-10-16

我认为我面临的问题竞争条件,但不确定。以下是我的代码:

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  %dn",client_socket);
}

这里我正在接收线程参数并对其进行类型转换。当我打印(或使用)它的值时,它大多数时候给出的值被发送给前一个线程(相同的线程函数)。我在网上搜索了一下,有人说这是因为比赛条件。

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

提前感谢。

@Edit: created int newsocket_fd;

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

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

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

相关文章: