【问题标题】:Prinft line by line of file single thread C逐行打印文件单线程C
【发布时间】:2015-12-22 04:14:24
【问题描述】:

我非常纠结于一个问题,我需要一个线程一个线程一个一个地打印文件。这是代码:

   #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
    #include <string.h>
    /* Prototypes */

    pthread_t reader;

    void *readLine(void *line)
    {   
        printf("Thread: %s \n",(char*)line);
        pthread_exit(NULL);
    }

    int main(int argc, char *argv[])
    {
        FILE * fp;
        char * line = NULL;
        size_t len = 0;
        ssize_t read;



        fp = fopen("texto.txt", "r");
        if (fp == NULL)
            exit(EXIT_FAILURE);



        while ((read = getline(&line, &len, fp)) != -1)   {

            if(pthread_create(&reader, NULL, readLine, (void *)line)) {
                    fprintf(stderr, "Error creating thread\n");         
            }

        }


        fclose(fp);
        if  (line)
            free(line);
        exit(EXIT_SUCCESS);
    }

此代码打印行乱序,没有所有线程都打印readLine传递的行,如何由同一个线程阅读器逐行打印?

【问题讨论】:

  • 如果您只需逐行打印,为什么还要使用pthread?我很确定,如果你产生一堆线程并且每个线程的工作是打印一行,那么一些线程将“乱序”完成执行。
  • 如果您没有将相同的行缓冲区传递给所有这些,这会有所帮助。想想看——如果你启动线程,然后你将下一行读入同一个缓冲区,然后线程调用printf
  • 我只是工作的一部分,但主要是逐个线程传递给另一个线程。
  • 除了 immibis 所说的之外,如果您希望在多线程环境中以特定顺序发生任何事情,那么您需要显式同步。目前尚不清楚您希望程序如何运行。但是序列化输出的一种方法是在pthread_create 之后调用pthread_join 以等待线程完成其工作。结果是一个非常无用的程序,因为没有线程可以更有效地完成相同的程序。但它会以正确的顺序产生输出。
  • kaylum - :谢谢!我已经把 ptrhead_join (但我认为,不是在正确的位置),与 pthrad_join 在创建后完美工作。 TY

标签: c multithreading file line-by-line


【解决方案1】:

基本上,通过使用独立线程,您可以独立地发送它们,它们可能会相互传递。

假设您派 20 个人独立地跑到星巴克并喝杯咖啡 - 根据他们的驾驶和路线选择,他们将按任何顺序到达,不可重复,而不是按照您发送它们的顺序。

要继续举例,只需派一个人去买二十杯咖啡,你就可以了。

【讨论】:

  • 想象一下,你派 20 个人单独跑到星巴克去喝杯咖啡 - 根据他们的驾驶和路线选择,他们会以任何顺序到达,不可重复,也不是按照你的顺序送他们。在这种情况下,你在他们回来之前就开走了。
猜你喜欢
  • 2013-08-15
  • 1970-01-01
  • 2016-05-13
  • 2012-09-15
  • 2022-11-24
  • 2019-07-27
  • 2017-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多