2010-07-07 54 views
7

有人有一个线程c的简单例子吗?在linux中的C线程?

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

+1

如何拆分和是否需要是非常非常具体的设计。通过处理,你的意思是什么,文件中的数据类型......对于所有情况都没有一个解决方案。 – pmod 2010-07-07 19:49:49

+0

每一行都是一个url,“processing”将访问url并解析一些文本。 – jahmax 2010-07-07 21:53:07

回答

6

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

+0

用于pthreads的+1 – Incognito 2010-07-07 20:31:23

7

搜索pthread。 我也是一个线程新手。这是一个代码片段,总计从1到1000000000(也是我的第一个工作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; 
} 
+1

应将“rst”声明为“volatile”。此外,此代码仅在C99标准下有效,这不是有效的C89。 – 2010-07-07 20:53:32

+0

没有必要。它从未被修改过。 – 2010-07-07 21:02:16

+2

'rst'不需要是'volatile'指针,代码很好。 '*(x-> rst)'的存储不能被编译器忽略,因为它不能确定它的外部可见;和'pthread_join'意味着一个障碍。 – caf 2010-07-07 23:43:15

8

恕我直言,最好的选择是使用POSIX线程。你可以看到更多的细节HERE

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

3

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

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

这将执行简单的加法两个阵列的和结果存储在“一”,但四核的机器上,将产生4个线程来处理它,(8是否支持超线程)。

Linux上的简单多核编程。 :)

一个导游芬兰人:http://bisqwit.iki.fi/story/howto/openmp/

1

分裂成TXT X其中X = N的 线程,是自带 我想到的第一件事,就是有没有更好的办法?

这取决于您的应用程序。

    如果解释数据是瓶颈,性能增益将通过文件I/O速度
  • 线程不会帮助,如果读取的文件是瓶颈,磁盘I/O的限制
  • 线程可以帮助受硬件限制,只会在更多线程请求数据时降级

如果解释信息需要很长时间,您可以使用类似producer consumer pattern之类的东西,并测试自己需要多少线程。 (尝试一个较低的数字,看看有多少给你最好的表现)。一些例子可以发现herehere

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

+0

解读数据是瓶颈,我需要访问网址,一次只做一个,速度缓慢而且跛脚。该维基链接非常酷,谢谢,你有一些生产者 - 消费者“解决方案”的例子? – jahmax 2010-07-07 21:56:38

1

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

即使您决定使用线程,Glib也许值得您一试,因为它具有体面的线程抽象,包括线程池。这将使分区文件变得非常简单,因为您只需创建X个线程池,然后将dl/parse池添加到其中的一个(行号%池大小)。

如果只是为了加速下载,也许你的http库已经具有相关的功能。卷曲,有一堆curl_multicalls,有一个有趣的example here

+0

顺便说一句,在卷曲示例中,还有一个[多线程](http://www.google.com/codesearch/p?hl=en#R2f_w0jVjyE/pub/solaris-freeware/SOURCES/curl- 7.12.2.tar.gz%7CfL00qoACRlM/curl-7.12.2/docs/examples/multithread.c&d = 7)这可能就是你需要的。 – mhd 2010-07-07 22:58:43