Передайте char * в функцию pthread_read - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь создать pthread и вставить его в список для каждой строки, которую я прочитал в file.txt.

Я пытаюсь отправить символ * в функцию showMessage в pthread_create, но когда я пытаюсь распечатать его, на экране появляется пустое место:

#include <iostream>
#include <thread>
#include <list>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <pwd.h>

using namespace std;

void *showMessage( void *ptr ){

   cout << "String: " << (char*)ptr << endl; //Blank space

    pthread_exit(0);
}


int main(int argc, char **argv) 
{  
    list<pthread_t*>thrds;
    list<pthread_t*>::iterator it;
    pthread_t * pt;
    size_t len = 0;
    size_t read;
    char * line = NULL;
    FILE * fp;
    int iret;

    fp = fopen ("./file.txt","r");
    if (fp == NULL)
    {
      fclose (fp);
      return 1;
    }

    while ((read = getline(&line, &len, fp)) != -1) {   //Read file.txt
        pt = new pthread_t();
        thrds.push_back(pt);
        iret = pthread_create( pt, NULL, showMessage, line); //Create pthread and send function ShowMessage and line read in file.txt
        if(iret)
        {   
           fprintf(stderr,"Error - pthread_create() return code: %d\n",iret);
           exit(EXIT_FAILURE);
        }
    }

    for (list<pthread_t*>::iterator it = thrds.begin(); it != thrds.end(); ++it){
         pthread_join( **it, NULL);   
    }

    fclose (fp);

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

Поскольку вы используете C ++, было бы намного проще использовать std::thread и std::string вместо pthreads и raw char* s. 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

0 голосов
/ 04 ноября 2018

Ваша программа имеет неопределенное поведение, потому что в то же время вы пишете и читаете один и тот же буфер памяти, смотрите:

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); // <-

Теперь операции записи и чтения разделены, и это должно работать. Не забудьте освободить все выделенные ресурсы.

...