2010-07-07 44 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