线程总是带来分段错误

时间:2017-10-29 21:31:46

标签: c multithreading segmentation-fault

我正在研究一个程序,该程序将读取文件中的不同行并为每个程序启动一个程序,根据行上的写入程序,它将执行各种操作,但是我保留得到分段错误错误,我不知所措,试图解决它。

我试图关注此问题主题中的所有内容:passing pointer char argument to function in thread

但它仍无法正常工作。线程函数将是:

void *thread(void *arg)
{
    char *buf = arg;
    char *tok, *sp;
    //extracting transaction type
    tok = strtok_r(buf, " ", &sp);

//Branchement selon le type de transaction
            switch(tok[0]){
        ...
        }

并将由此部分调用:

 void* readTranslinkedINFO(char* nomFichier){
        FILE *f;
        char buffer[100];
        pthread_t tid;

        //Opening file
        f = fopen(nomFichier, "rt");
        if (f==NULL)
            error(2, "readTrans: Erreur lors de l'ouverture du fichier.");

        //read first line
        fgets(buffer, 100, f);

        //start a thread for each line
        while(!feof(f)){
            pthread_create(&tid, NULL, thread, buffer);
            //reading next line
            fgets(buffer, 100, f);
        }
        pthread_join(tid, NULL);
        //closing file
        fclose(f);
        //Return
        return NULL;

非常感谢任何帮助 对不起,如果还有一些法语单词 感谢

1 个答案:

答案 0 :(得分:1)

  1. Why is “while ( !feof (file) )” always wrong?
  2. 您有数据竞争,因为相同的地址buffer会传递给所有线程。您可以使用strdup()将每行的副本传递给每个线程,并且线程函数可以自由处理它。
  3. 您没有保存线程ID,因此您只加入您创建的最后一个线程。
  4. 始终对所有可能失败的函数(pthread_create,fgets等)进行错误检查。
  5. 仅处理一行的线程不会非常有效 - 但我认为这是出于学习/教育目的。否则,这种多线程的实现会适得其反。想象一下,你有一个包含一百万行的数据文件。创建一百万个线程既糟糕又不太可行。