代码之家  ›  专栏  ›  技术社区  ›  jahmax

linux中的C线程?

  •  7
  • jahmax  · 技术社区  · 14 年前

    有没有人有一个简单的c线程示例?

    我想建立一个小控制台应用程序,将读取一行一行的txt文件,然后使用线程来处理整个txt。我该怎么做?把txt拆分成X,其中X=N个线程,这是我想到的第一件事,有没有更好的方法?

    6 回复  |  直到 14 年前
        1
  •  7
  •   James    14 年前

    搜索POSIX线程,也称为pthreads。 Tutorial Here

        2
  •  8
  •   Zifei Tong    14 年前

    #include <stdio.h>
    #include <pthread.h>
    
    struct arg {
        int a, b;
        int *rst;
    };
    typedef struct arg arg;
    
    void* sum(void *);
    
    int main()
    {
        pthread_t sum1, sum2;
        int s1, s2;
        pthread_create(&sum1, NULL, sum, &(arg){1, 500000000, &s1});
        pthread_create(&sum2, NULL, sum, &(arg){500000001, 1000000000, &s2});   
        pthread_join(sum1, NULL);
        pthread_join(sum2, NULL);
        printf("%d\n", s1 + s2);
    }
    
    void* sum(void *ptr)
    {
        int i, temp = 0;
        arg *x = ptr;
    
        for(i = x->a; i <= x->b; ++i)
            temp += i;
        *(x->rst) = temp;   
    }
    
        3
  •  8
  •   Incognito    14 年前

    IMHO的最佳选择是使用POSIX线程。你可以看到更多的细节 HERE

    也请检查詹姆斯答案中的链接。

        4
  •  3
  •   kobrien    14 年前

    如果您想要一个简单的方法来做这件事,OpenMP是一个功能强大的多线程库,gcc支持它。

      #omp parallel for
      for(i=0; i<1000; i++){
        a[i] = b[i] + c[i];
      }
    

    这将执行两个数组的简单加法并将结果存储在“a”中,但在四核计算机上,将产生4个线程来处理它(如果支持超线程,则为8个)。

    芬兰人指南: http://bisqwit.iki.fi/story/howto/openmp/

        5
  •  1
  •   mhd    14 年前

    第一件事是问问自己是否真的需要在这里执行多线程。您是否需要线程之间的共享状态,例如,来自所有url的解析信息最终是否位于同一数据结构中?否则,进程(fork)就足够了。或者你甚至可能不会走那么远,只使用基于事件的编程(glib,libev)。

    如果只是为了加速下载,也许你的http库已经有了相关的功能。对于curl,有一堆curl\u multicall,有一个有趣的 example here .

        6
  •  1
  •   josefx    14 年前

    将txt拆分为X,其中X=N 在我看来,有更好的办法吗?

    这取决于你的申请。

    • 如果解释数据是瓶颈,线程可能会有所帮助,性能增益将受到文件I/O速度的限制
    • 如果读取文件是一个瓶颈,线程就没有帮助,磁盘I/O受到硬件的限制,只有在更多线程请求数据时才会降级

    producer consumer pattern 并测试自己需要多少线程(试着用一个低的数字,看看有多少给你最好的表现)。可以找到一些例子 here here

    正如其他答案所指出的,您可以使用pthreads来实现线程。