問題在於你創建進程的參數&i.
這個i在線程啟動的時候變掉了,不是你想的0,1,2了。
你把這個地方改一下就行了。
我剛測試通過的。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <ctype.h>
#include <pthread.h>
#define MAX_THREAD 3 /* 線程的個數 */
unsigned long long main_counter, counter[MAX_THREAD];
/* unsigned long long是比long還長的整數 */
void* thread_worker(void*);
int main(int argc, char* argv[])
{
int i, rtn, ch;
int abc[MAX_THREAD] = {0,1,2};
pthread_t pthread_id[MAX_THREAD] = {0}; /* 存放線程id*/
for (i=0; i<MAX_THREAD; i++)
{
/* 在這里填寫代碼,用pthread_create建一個普通的線程,
線程id存入pthread_id[i],線程執行函數是thread_worker
並i作為參數傳遞給線程 */
pthread_create(&pthread_id[i],NULL,thread_worker,&abc[i]);
}
do {/* 用戶按一次回車執行下面的循環體一次。按q退出 */
unsigned long long sum = 0;
/* 求所有線程的counter的和 */
for (i=0; i<MAX_THREAD; i++)
{/* 求所有counter的和 */
sum += counter[i];
printf("%llu\n ", counter[i]);
}
printf("%llu/%llu\n", main_counter, sum);
} while ((ch = getchar()) != 'q');
return 0;
}
void* thread_worker(void* p)
{
int thread_num;
/* 在這里填寫代碼,把main中的i的值傳遞給thread_num */
thread_num = *((int*)p);
for(;;)
{
/* 無限循環 */
counter[thread_num]++; /* 本線程的counter加一 */
main_counter++; /* 主counter 加一 */
}
}
測試:
[admin@njgxserver02 ~]$ ./a.out
0
0
0
0/0
146908616
89336044
16948553
110371624/253193213
243883474
136339926
32212603
174397763/412436003
350577402
190203183
48289704
238267135/589070289
q
『貳』 Linux C下如何創建一個線程
pthread_create(&id,NULL,move,stack);//若stack為字元數組而非字元指針時,傳入時不需要強轉
調用時:
void* move(void* str)
{
char *p = (char*)str;//由void*強轉為char*
......
}
『叄』 linux c 多線程 響應時間
BAC的順序,只是啟動下一個線程前,需要等待另一個線程的結果返回,你可以配合介面,來回調,
例如:
class Main implement BListener{
public void startTask(){
啟動B線程,並傳入listener實例,來回調用;
}
//override
public void BTaskComplete(){
B線程成功執行;
啟動A線程;
}
}
class B extends Thread{
可以構造時獲取Listener實例;
public void run(){
執行完畢出結果,Listener.BTaskComplete();
}
}
『肆』 linux c程序開機自啟
實現方式1(高大上方式):通過在/etc/init.d下添加啟動/停止腳步,並在相應運行級別的/etc/rc.d/rcX.d目錄下建立相應軟連接的方式。這是LInux標准服務的啟動方式,同時也支持採用service XXX start的方式啟動和關閉。
1. 在/etc/init.d下放置相應啟動程序的腳本,腳本必須實現start, stop, restart三和操作。可以參考該目錄已有的腳本,改寫一下就行。
2. 在/etc/rc.d/rcX.d(如rc3.d)目錄下用ln建立命令建立相應的link文件,K開頭為關機時調用的,S開頭為開機時使用的,後面接的數字表明這個服務相對於其它服務的啟動優先順序。可以參考該目錄已有的連接文件名,ln一下就行。
實現方式2(菜鳥方式): 修改/etc/rc.d/rc.local。這個文件一般會放一些用戶個性化的命令。
有點像早期 DOS 年代的 autoexec.bat 與 config.sys, 它就是一個腳本,在里頭添上你的應用就行了。
『伍』 linux下 c 語言線程池怎麼調用
1 使用線程池的原因
通常使用多線程都是在需要的時候創建一個新的線程,然後執行任務,完成後退出。一般情況下是完全夠滿足我們的程序的。
但是當我們需要創建大量的線程,並且執行一個簡單的任務之後銷毀,比如:在web,email,db裡面的一些應用,如彩鈴,或者網路通信編程,或者雲計算裡面後台鏡像處理的時候,我們的應用在任何時候都要准備面對數目巨大的連接請求,同時,這些請求執行的任務卻又比較簡單,佔用的時間很少,這樣我們可能就會處於不停的創建線程並銷毀線程的狀態。雖說比起進程的創建,線程的創建時間已經大大縮短,但是如果需要頻繁的創建線程,並且每個線程所佔用的處理時間又非常簡短,則線程創建和銷毀帶給處理器的額外負擔也是很可觀的。
線程池的作用正是在這種情況下有效的降低頻繁創建銷毀線程所帶來的額外開銷。一般來說,線程池都是採用預創建的技術,在應用啟動之初便預先創建一定數目的線程。應用在運行的過程中,需要時可以從這些線程所組成的線程池裡申請分配一個空閑的線程,來執行一定的任務,任務完成後,並不是將線程銷毀,而是將它返還給線程池,由線程池自行管理。如果線程池中預先分配的線程已經全部分配完畢,但此時又有新的任務請求,則線程池會動態的創建新的線程去適應這個請求。當然,有可能,某些時段應用並不需要執行很多的任務,導致了線程池中的線程大多處於空閑的狀態,為了節省系統資源,線程池就需要動態的銷毀其中的一部分空閑線程。因此,線程池都需要一個管理者,按照一定的要求去動態的維護其中線程的數目。
當然,如果線程創建和銷毀時間相比任務執行時間可以忽略不計,則沒有必要使用線程池了。
『陸』 linux C語言 makefile編譯、關閉線程、開啟線程怎麼做
線程跟makefile沒有關系
用fork或者pthread_* api來使用進程和線程
『柒』 在linux下的C語言線程
第一步,確保你的linux系統安裝了GCC或G++,在linux的終端下輸入gcc,如果有提示參數配置,表示安裝了,如果提示無法直達的指令,表示沒有安裝,可以網路一下GCC安裝。
centOS下面是,rpm -install gcc;
第二步,利用vi寫一個test.c 文件,主要C語言後綴要是.c.
第三步,利用gcc編譯新建的文件。
『捌』 linux線程如何運行
pthread_create執行後,如果執行成功會生成一個子線程 也就是現在有兩個線程同時運行
父線程還會繼續執行後面的代碼 直到結束
子線程則開始執行thread函數體里的代碼了 別的不執行
pthread_join會按照父線程執行順序 到它了就會執行 該函數的作用是阻塞等待一個線程執行完畢
在你的代碼里 不一定在子線程執行3次後才啟動 也可能子線程沒有執行呢 父線程就執行到pthread_join了 然後阻塞等待子線程
如果你想讓pthread_join在子線程3次執行後才啟動 可以讓父線程sleep下 不過子線程執行完了 你再執行pthread_join也就沒有什麼意義了
不懂再問