gpt4 book ai didi

c++ - pthread 上的段错误

转载 作者:搜寻专家 更新时间:2023-10-31 00:00:43 25 4
gpt4 key购买 nike

我正在学习pthread,下面是我的简单代码:

  1 #include <pthread.h>
2 #include <cstdlib>
3 #include <iostream>
4 #include <string>
5 #include <sstream>
6
7 using namespace std;
8
9 struct ThreadParam
10 {
11 int thread_id;
12 string message;
13 };
14
15 string int2string(int i)
16 {
17 stringstream s;
18 s << i;
19 return s.str();
20 }
21
22 void * Hello(void * param)
23 {
24 ThreadParam * threadParam = (ThreadParam*)param;
25
26 int tid = threadParam->thread_id;
27 string msg = threadParam->message;
28 string output = msg + " In thread " + int2string(tid);
29
30 cout << output << endl;
31 pthread_exit(NULL);
32 }
33
34 int main()
35 {
36 const int count = 30;
37 ThreadParam params[count];
38
39 pthread_t threads[count];
40 int rc;
41 for(int t=0; t < count; t++)
42 {
43 cout << "In main: creating thread " << t << endl;
44
45 params[t].thread_id = t;
46 params[t].message = "Hello " + int2string(t) + "!";
47
48 rc = pthread_create(&threads[t], NULL, Hello, (void*)&params[t]);
49
50 if(rc)
51 {
52 cout << "Error! Return code is " << rc << endl << flush;
53 exit(-1);
54 }
55 }
56 pthread_exit(NULL);
57 }

我在创建最后一个线程后遇到段错误。输出是:

In main: creating thread 0
In main: creating thread 1
In main: creating thread 2
In main: creating thread 3
In main: creating thread 4
In main: creating thread 5
In main: creating thread 6
In main: creating thread 7
In main: creating thread 8
In main: creating thread 9
In main: creating thread 10
In main: creating thread 11
Hello 0! In thread 0
Hello 1! In thread 1
Hello 2! In thread 2
Hello 3! In thread 3
Hello 4! In thread 4
In main: creating thread 12
In main: creating thread 13
In main: creating thread 14
In main: creating thread 15
In main: creating thread 16
In main: creating thread 17
In main: creating thread 18
In main: creating thread 19
In main: creating thread 20
In main: creating thread 21
In main: creating thread 22
In main: creating thread 23
In main: creating thread 24
In main: creating thread 25
In main: creating thread 26
In main: creating thread 27
In main: creating thread 28
In main: creating thread 29
Segmentation fault

我不知道为什么,有什么线索吗?

最佳答案

查看您的代码我可以看出,在您创建最后一个线程后,您会销毁主线程(“创建者”线程)。这导致该线程的堆栈被释放。但是因为您使用指向主线程堆栈内存的指针(ThreadParam params[count]; 准确地说;您将指向它的指针传递给 pthread_create 函数)然后您尝试读取其他线程中的无效数据。分配给主线程堆栈的内存页面在主线程销毁后被标记为“未使用”或“未分配”,因此您在尝试访问它们时会遇到段错误。

UPD:正如其他人所说,您应该使用 pthread_join 函数等待所有线程完成,然后销毁主线程。

关于c++ - pthread 上的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12414561/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com