Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Pthreads:需要了解上一个线程的输出的帮助吗_C++_Multithreading - Fatal编程技术网

C++ Pthreads:需要了解上一个线程的输出的帮助吗

C++ Pthreads:需要了解上一个线程的输出的帮助吗,c++,multithreading,C++,Multithreading,我正在试图了解pthread是如何工作的。 我有一个小布尔函数来检查素数 我有一个线程输入数据的小结构,还有线程的函数当我为所有5个线程将prime函数的输入值设置为5时。线程0-3输出true(是一个素数),但最后一个线程输出false。我的问题是为什么 (免责声明:我遵循了教程中的代码。仍然是新的编码,所以不完全确定是否可以像这样发布在这里) #包括 #包括 #包括 #包括 使用名称空间std; #定义NUM_线程5 //这里是素数函数 布尔素数(整数n) { 如果(n==1){返回f

我正在试图了解pthread是如何工作的。
我有一个小布尔函数来检查素数
我有一个线程输入数据的小结构,还有线程的函数
当我为所有5个线程将prime函数的输入值设置为5时。线程0-3输出true(是一个素数),但最后一个线程输出false。我的问题是为什么

(免责声明:我遵循了教程中的代码。仍然是新的编码,所以不完全确定是否可以像这样发布在这里)

#包括
#包括
#包括
#包括
使用名称空间std;
#定义NUM_线程5
//这里是素数函数
布尔素数(整数n)
{   
如果(n==1){返回false;};
如果((n==2)|(n==3)){return true;};
如果((n%2==0)| |(n%3==0)){返回false;};
int sqrt_n{0};
sqrt_n=sqrt(n);
int i{5};
虽然(i代码实际上(*几乎!)按预期工作。但您被来自不同线程的输出是交错的这一事实所误导,请参见。因此,您看不到您所期望的

要解决此问题,请将特定线程的所有输出累积到缓冲区中,然后一次性输出,如下所示:

std::stringstream ss;
ss << "Thread ID : " << my_data->thread_id << "\n";
ss << "Thread Prime : " << prime(my_data->number) <<"\n" ;
std::cout << ss.str ();
std::stringstream-ss;

ss起初,我在复制您的bug时遇到了麻烦,但我最终通过使用
-fsanize=thread
成功地做到了这一点:一个或多个线程最终可能会产生虚假数据,这不仅仅是输出混合的结果。添加
睡眠(2)
对工作人员来说更容易查看,打印出
my_data->number
的值也更容易查看(您可以看到像
22077
这样毫无意义的值,它实际上不是素数)

我认为问题在于主线程在退出之前没有加入工作线程。因此,它可能会在线程仍在运行时退出。当它退出时,它的堆栈(即
t\u d
数组所在的位置)将变为无效,并可能被垃圾覆盖。工作线程可能会在解除对其的引用时读取此垃圾r
my_data
指针(当然,除了读取垃圾之外,它还可能以其他方式失败,例如segfault;这是未定义的行为,任何事情都可能发生。)

main
中,您应该在退出或返回之前循环线程并
pthread\u join
每个线程。或者,如果确实想让主线程先退出,则应将
t\u d
数组设置为
静态
或全局


请注意,此错误已出现在的教程代码中-这肯定是他们的错,而不是你的错。不幸的是,我无法在他们的网站上提交错误报告,因此我猜此错误教程将继续让学习者无限期地沮丧。也许你想在其他地方获得教程。

当你向线程传递指针时对于对象,必须确保该对象在接收指针的线程访问该对象之前保持有效

在这里,您将新创建的线程指针传递给
main
中堆栈上分配的对象。虽然
main
没有返回,但运行它的线程确实会终止。线程终止后,它的堆栈不再存在,因此在调用
main
的线程调用
pthread>之后取消引用指针是一个错误_退出


您没有同步来防止这种情况发生。因此,您的代码存在争用情况。

能否显示错误的输出?
std::stringstream ss;
ss << "Thread ID : " << my_data->thread_id << "\n";
ss << "Thread Prime : " << prime(my_data->number) <<"\n" ;
std::cout << ss.str ();