当前位置: 首页 > 知识库问答 >
问题:

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

丁志勇
2023-03-14

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

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);
}

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

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

先谢谢你。

@编辑:创建intnewsocket_fd;在while循环内。

共有2个答案

贾俊艾
2023-03-14

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

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

况唯
2023-03-14

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

 类似资料:
  • 问题内容: 这是带有潜在竞争条件的Django视图的简单示例: 竞争条件应该非常明显:用户可以两次发出此请求,并且该应用程序可能同时执行,从而导致其中一个请求覆盖另一个请求。 假设函数相对复杂,并且基于无法放置在单个存储过程中并且难以放置在存储过程中的各种奇怪的东西进行计算。 所以这是我的问题:django可使用哪种锁定机制来处理类似的情况? 问题答案: Django 1.4+支持select_f

  • 问题内容: 我正在阅读本书第4.3.5节 我不清楚它在哪里说 私有构造函数的存在是为了避免如果将复制构造函数实现为(px,py)时会发生竞争情况。这是私有构造函数捕获习语的一个示例(Bloch和Gafter,2005)。 我知道它提供了一个同时在数组中一次获取x和y的getter,而不是为每个数组分别获取一个getter,因此调用方将看到一致的值,但是为什么要使用private构造函数呢?这有什么

  • 一定要注意 请确保你修改的类上的 JDoc, 有你的大名,比如 "@author zozoh(zozohtnt@gmail.com)" 首先,体现了你的贡献 否则,出了问题,不知道由谁主要负责 请尽量用统一的 code formatter, 导入 /nutz/doc/eclipse/nutz-eclipse-java-code-format-1.0.xml,否则我们同步代码是很难比较 去掉的代码不

  • 某一些模块提交的源码仓库的代码,可能并不完整。 在jenkins构建的时候,如何剔除这些“尚未完工”的模块呢? 因为源码仓库有“留痕”的作用,在一个比较大的重构过程中,可能需要将部分重构代码提交源码仓库,这样可以利用源码仓库的版本历史,方便查阅每次的代码变动、在某些时候,还可以进行代码回退。 提交到源码仓库的可能并不是一个完整的功能。 jenkins在构建的时候,如何管理跳过这些未完工的模块代码呢

  • 所以我应该从{P1:N1,P2:N2}中找到赢家,其中N1和N2是玩家P1和玩家P2在比赛中获胜的游戏数,我必须编写一个函数,它获取所有比赛记录的列表并返回锦标赛赢家的名字。 锦标赛获胜者被确定为每个输入中获胜次数最多的玩家。 此外,如果不能确定获胜者,函数应该返回字符串。 示例 这是我到目前为止对代码的尝试... 但是它真的不起作用...我应该对我的代码做什么修改??

  • 我正在创建一个自定义记录器,在这里我们可以登录到std out和std err,但也可以登录到kafka(代码示例如下:https://github.com/roppa/kafka-go). 我们有多个主题,所以我们需要多个记录器,但当我们使用多个时,就会发生一些奇怪的事情。当Kafka围棋的两个设置都是异步的时,我不会收到消费者消息,当一个是异步的,另一个是同步的时,我们会得到如下结果: 更改同