【问题标题】:How it can be a race condition. Or it is something wrong with my code它怎么可能是一个竞争条件。或者我的代码有问题
【发布时间】:2013-06-19 09:45:04
【问题描述】:

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

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

【问题讨论】:

    标签: c++ c linux multithreading pthreads


    【解决方案1】:

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

    【讨论】:

    • 现在请看我编辑的帖子。我在这里重新创建 int newsocket_fd,仍然是竞争条件?
    • 只发送整数值有什么问题?答。现在我只发送 int 值。技术上正确。但从概念上讲它是错误的,不是吗?
    • @Nick:谢谢。不确定当前项目。但我肯定会学习 Boost.Asio。很久以来我都在等待学习提升。 (懒我。)
    • @JamesKanze:@user2481987:直到 1990 年代中期,每个连接一个 进程 是首选解决方案,当时 互联网 意味着几千机器和 5 个同时用户相当于一个非常繁忙的站点。每个连接一个 thread 是为了使整个概念更加轻量级(上下文切换和内存),但它并没有那么不同,并且具有额外的缺点:与流程相比。多年来,首选解决方案一直是使用单个线程(例如 selectpoll)多路复用 I/O。
    • 另外,与普遍看法相反,产生线程并不是一个廉价的操作,在任何其他操作系统下都不是,在 Linux 下也不是。事实上,在 Linux 下生成线程(除了普遍认为的)相当昂贵,因为操作系统根本没有“线程”的概念。每次accept 返回时都调用sys_clone(这是你有效所做的)并不是人们真正想做的事情。
    【解决方案2】:

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

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

    【讨论】:

    • 现在请看我编辑的帖子。我在这里重新创建 int newsocket_fd,仍然是竞争条件?
    • 是的,现在只有更糟糕的一个,因为线程可能会访问堆栈变量,为什么它不再存在。我也编辑了我的帖子。
    • 只能将一个答案标记为已接受。否则这也满足我的要求。
    猜你喜欢
    • 2021-05-16
    • 2011-04-03
    • 2020-06-12
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    相关资源
    最近更新 更多