我正在尝试创建一个pthread,并将其插入到file.txt中读取的每一行的列表中。
我尝试将char *发送给pthread_create中的showMessage函数,但是当我尝试打印它时,在屏幕上却出现空白:
NodeJS.ReadableStream
答案 0 :(得分:1)
您的程序具有未定义的行为,因为同时您正在写入和读取相同的内存缓冲区,请看:
iret = pthread_create( pt, NULL, showMessage, line); // start reading operation
以上行启动线程,该线程打印由line
指针指向的字符。在while循环的下一个迭代中启动该线程之后,您将调用getline
函数,该函数将按指针获取line
。 getline
可以在开始线程中打印时同时修改line
指向的字符串。
阅读完一行后,您可以制作一份副本,然后将此副本传递给打印功能。
pt = new pthread_t();
thrds.push_back(pt);
char* copy = malloc(strlen(line)+1);
strcpy(copy,line);
iret = pthread_create( pt, NULL, showMessage, copy); // <-
现在,读写操作是分开的,它应该可以工作。请记住释放所有分配的资源。
答案 1 :(得分:1)
由于您使用的是C ++,因此使用std::thread
和std::string
而不是pthread和原始char*
会容易得多。 std::thread
不仅更易于与C ++对象一起使用,而且还可以跨平台使用。
使用标准的C ++构造,您的程序将如下所示:
#include <iostream>
#include <thread>
#include <list>
#include <fstream>
void showMessage(const std::string& str) {
std::cout << "String: " << str << '\n';
}
int main() {
std::list<std::thread> thrds;
std::ifstream file("file.txt");
std::string line;
while (std::getline(file, line)) { //Read file.txt
thrds.emplace_back(showMessage, std::move(line)); // Create thread and add it to the list
}
for (std::thread& th : thrds) {
th.join();
}
}