【问题标题】:C threading in linux?Linux中的C线程?
【发布时间】:2010-07-07 19:42:50
【问题描述】:

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

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

【问题讨论】:

  • 如何拆分以及是否需要拆分取决于您的设计。处理是什么意思,文件中有什么样的数据..没有一种解决方案适用于所有情况。
  • 每一行都是一个url,“处理”将访问url并解析一些文本。

标签: c linux multithreading


【解决方案1】:

搜索 pthread。 我也是线程新手。这是从 1 到 1000000000 求和的代码 sn-p(也是我的第一个工作 pthread 程序)。

#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;   
}

【讨论】:

  • rst 应声明为volatile。另外,此代码仅在 C99 标准下有效,这在 C89 下无效。
  • 不需要。它从未被修改过。
  • rst 不需要是volatile 限定指针,代码没问题。 *(x-&gt;rst) 的存储不能被编译器忽略,因为它无法确定它是否在外部可见;而pthread_join 意味着一个障碍。
【解决方案2】:

恕我直言,最好的选择是使用 POSIX 线程。您可以查看更多详情HERE

另外请查看 James 回答中的链接。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      如果您想要一个简单的方法,OpenMP 是 gcc 支持的强大的多线程库。

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

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

      在 Linux 上轻松进行多核编程。 :)

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

      【讨论】:

        【解决方案5】:

        首先要问自己是否真的需要在这里做多线程。您是否需要线程之间的共享状态,例如来自所有 URL 的解析信息是否以相同的数据结构结束?如果没有,进程(fork)可能就足够了。或者你甚至可能不会走那么远,只使用基于事件的编程(glib、libev)。

        即使您最终决定使用线程,Glib 也可能值得您花时间,因为它具有不错的线程抽象,包括线程池。这将使您的文件分区变得非常容易,因为您只需创建 X 线程池,然后将 dl/parse 池添加到其中之一(行号。% 池大小)。

        如果只是为了加快下载速度,可能你的 http 库已经有了相关的功能。对于 curl,有一堆 curl_multicalls,有一个有趣的 example here

        【讨论】:

        • 顺便说一下,在 curl 示例中,还有一个 multi-thread one 可能正是您所需要的。
        【解决方案6】:

        将 txt 拆分为 X,其中 X=N 的 线程,是第一个出现的东西 在我看来,有没有更好的方法?

        这取决于您的应用程序。

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

        如果解释信息需要很长时间,您可以使用 producer consumer pattern 之类的东西并测试自己需要多少线程。 (尝试使用较低的数字,看看有多少可以为您提供最佳性能)。一些例子可以在herehere找到

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

        【讨论】:

        • 解释数据是瓶颈,我需要访问 url 并且一次做一个很慢而且很蹩脚。那个 wiki 链接很酷,谢谢,你有一些 c 中生产者-消费者“解决方案”的例子吗?
        猜你喜欢
        • 2013-07-08
        • 1970-01-01
        • 1970-01-01
        • 2019-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-04
        相关资源
        最近更新 更多