c++ - 它怎么可能成为竞争条件。或者我的代码有问题

标签 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: created int newsocket_fd;在 while 循环内。

最佳答案

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

关于c++ - 它怎么可能成为竞争条件。或者我的代码有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17188050/

相关文章:

c++ - 推导显式特化函数模板类型

linux - 使用另一个运行 Ansible 的 Vagrant Linux VM 来配置 Vagrant Linux VM

java - 如何使用JNA通过引用传递结构

c++ - 数组式链表实现C++

c - 组装中的 split

C11网络编程

c - 在缓冲区中找到第一个未设置的位(优化)

linux - 服务器 LEMP 无响应(CentOS 5.5 final)

linux - 是否可以通过模式切换在 64 位进程中执行 32 位代码?

c++ - 临时和表达行为