这怎么可能是竞态条件.或者是我的代码有问题
How it can be a race condition. Or it is something wrong with my code
我认为我面临的问题竞争条件,但不确定。以下是我的代码:
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
可能在新线程从您给它的指针中读取它之前被修改(或者更糟,被销毁和重新创建)。这绝对是一个竞争条件。
最简单的修复方法就是在线程之间不共享相同的变量。如果您出于某种原因必须这样做,那么您必须确保在线程完成读取之前不会修改它,使用一些同步对象(条件)。
相关文章:
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- 代码在 CodeSignal 中工作不正确。不确定这是否是我的代码缺陷
- Qt GUI使用Qfiledialogbox和qlabel显示视频,这是我的代码
- 这是我的 .h 文件的一些错误,当我在其中包含我的类模板时,它显示 [错误] 未终止 #ifndef
- 合成错误不知道为什么会发生这种情况,请检查一下并告诉我这是我的编码还是视觉工作室
- 这是我的程序,C++使用 OpenCv 库从数据集中读取图像序列,但它没有运行
- C OPENCV中的错误是我的第一个代码(中值过滤器)
- 是我的等待 - 使用std :: mutex通知机制正确
- "... .exe hast stopped working"只发生在我朋友的电脑上,而不是我的电脑上
- 如果类外是我的朋友,类外::内也是
- f_close错误(写入SD卡是我的最终项目)
- 使用JNI从Java调用本机(C++)函数时发生访问冲突:这是我的代码问题,还是已知问题
- 我正在收到错误的“ list :: ShowList”:功能风格的初始化器似乎是我的CPP文件中的函数定义'
- 仍然是我的Vector版本
- std::priority_queue的最小堆是我的瓶颈
- 我一直收到一个错误,这是我第一次使用类,下面是我的代码:
- 这是我的代码,它正在返回Process返回的255(0xff)码块
- C++函数不是具有shared_ptr的类的成员,或者为什么我的变量未声明
- 这怎么可能是竞态条件.或者是我的代码有问题
- 我是否必须破坏孩子的任务,或者是父母的照顾