【发布时间】:2020-05-03 15:32:57
【问题描述】:
对不起我的英语。 我正在使用 QT Creator。 我刚刚开始研究线程)这是我的第一个严重问题。 我不明白为什么我无法从线程函数中获取字符串的确切值。
我尝试了很多选择,但一切都是徒劳的。 我试图做 'char *' 而不是 'string' ...尝试构建结构,但仍然无法正常工作。
#include <iostream>
#include <pthread.h>
#include <string>
#include <cstring>
#define NUM_THREAD 4
using namespace std;
struct message_info {
char* message;
};
void *PrintMessage(void *arg) {
message_info *new_info;
new_info = (struct message_info*)arg;
pthread_t id = pthread_self();
cout << "ID thread :" << id << new_info->message << endl;
pthread_exit(NULL);
}
int main(){
pthread_t id_stream[NUM_THREAD];
for (int i = 0; i < NUM_THREAD; i++){
struct message_info call_mess;
call_mess.message = "This is messaf";
int rec = pthread_create(id_stream, NULL, PrintMessage, (void *)&call_mess);
if (rec != 0) {
cout << "Error: Thread not created | " << rec << endl;
exit(-1);
}
}
pthread_exit(NULL);
}
【问题讨论】:
-
欢迎来到 SO。请将您的代码添加到问题中。跟随外部资源的链接是大多数人不想做的事情。此外,由于代码只是文本,无需将其显示为艺术品。只需将代码和任何纯文本输出复制并粘贴到问题中即可。这将大大增加响应。
-
你的代码是 C++ 而不是 C。
-
你将一个指向局部变量的指针传递给线程。当线程开始访问它时,变量已经被破坏的可能性很高。您的程序通过数据竞争表现出未定义的行为。
-
为什么要直接使用 pthreads 而不是
std::thread和朋友?另外,请记住,您需要对从多个线程访问的变量进行同步。然后是@Igor 提到的终身问题。 -
非常感谢大家 =) 我很高兴我明白为什么会发生这种情况。也许这个问题会用'pthread_join'解决