将char *传递给pthread_read函数

时间:2018-11-03 21:13:04

标签: c++ linux char pthreads void-pointers

我正在尝试创建一个pthread,并将其插入到file.txt中读取的每一行的列表中。

我尝试将char *发送给pthread_create中的showMessage函数,但是当我尝试打印它时,在屏幕上却出现空白:

NodeJS.ReadableStream

2 个答案:

答案 0 :(得分:1)

您的程序具有未定义的行为,因为同时您正在写入和读取相同的内存缓冲区,请看:

iret = pthread_create( pt, NULL, showMessage, line); // start reading operation

以上行启动线程,该线程打印由line指针指向的字符。在while循环的下一个迭代中启动该线程之后,您将调用getline函数,该函数将按指针获取linegetline可以在开始线程中打印时同时修改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::threadstd::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();
    }
}

Live Demo