【问题标题】:threading always bring segmentation fault线程总是带来分段错误
【发布时间】:2018-04-10 20:29:17
【问题描述】:

我正在开发一个程序,该程序将从文件中读取不同的行并为每个行启动一个线程,在该线程中它将根据行上的内容执行各种操作,但是我不断收到分段错误错误,我我在试图解决它时不知所措。

我试图关注这个问题线程中的所有内容: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;

任何帮助将不胜感激 对不起,如果这里和那里还有一些法语单词 谢谢

【问题讨论】:

  • 这里有一个竞争条件:在线程中读取缓冲区时写入缓冲区。
  • 你没有存储所有线程 ID,所以 join 不起作用。
  • 你为所有线程使用相同的缓冲区:它只是不能工作
  • 总结:1)您需要为每个线程分配一个缓冲区以避免缓冲区出现竞争条件。 2)你需要存储线程ID,如果你想在最后加入它们。现在您只加入最后分配的线程。我建议保留一个活动线程计数器而不是加入。
  • 您和您的教授/助教都明白这是一个非常低效的练习,是吗?

标签: c multithreading segmentation-fault


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

【讨论】:

  • 第 1 点没问题,因为 OP 读取然后检查 feof,所以这里没有问题。
  • 即使在这种情况下有效,它仍然是一个糟糕的习惯用法。使用fgets() 返回值作为循环条件不需要在循环之前读取一行并在读取一行后检查feof()。链接的帖子很好地解释了为什么即使feof 像记录的那样工作,它也很糟糕。
猜你喜欢
  • 2010-10-24
  • 2014-06-10
  • 2011-10-02
  • 2020-02-29
  • 2023-03-26
  • 2011-07-02
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
相关资源
最近更新 更多