#gcc a.c -o a #此句的-o a說明輸出目標文件為「a」;
#gcc -Wall-lpthread threadcreatetest.c #此句未註明輸出目標文件名,系統默認輸出為a.out,所以編譯之後執行./a.out文件。
如果上句也沒有指明「 -o a 」的話,輸出也是a.out,你可以試試
㈡ LINUX下多線程編譯問題
你編譯的時候有加多線程連接選項嗎? 要加上 -lpthread 或者 -pthread (盡量選後者)
例如 gcc -pthread -o test main.cpp
另外你的線程創建的不對,函數指針不能強轉類型(這里也不用轉)
pthread_create(&procter_t,NULL,(void*)procter_f,NULL);
pthread_create(&consumer_t,NULL,(void*)consumer_f,NULL);
應該是
pthread_create(&procter_t,NULL,procter_f,NULL);
pthread_create(&consumer_t,NULL,consumer_f,NULL);
㈢ 關於linux下多線程編程
pthread_join 線程停止等待函數沒有調用
pthread_create 線程生成後,沒有等子線程停止,主線程就先停止了。
主線程停止後,整個程序停止,子線程在沒有printf的時候就被結束了。
結論:不是你沒有看到結果,而是在子線程printf("..................\n");之前整個程序就已經停止了。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#define FALSE -1
#define TRUE 0
void *shuchu( void *my )
{
int j;
printf("..................\n");
}
int main()
{
int i = 0;
int rc = 0;
int ret1;
pthread_t p_thread1;
if(0!=(ret1 = pthread_create(&p_thread1, NULL, shuchu, NULL)))printf("sfdfsdfi\n");
printf("[%d]\n",p_thread1);
pthread_join(p_thread1, NULL);
return TRUE;
}
㈣ Linux下如何實現shell多線程編程以提高應用程序的響應
Linux中多線程編程擁有提高應用程序的響應、使多cpu系統更加有效等優點,下面小編將通過Linux下shell多線程編程的例子給大家講解下多線程編程的過程,一起來了解下吧。
#!/bin/bash
#———————————————————————————–
# 此例子說明了一種用wait、read命令模擬多線程的一種技巧
# 此技巧往往用於多主機檢查,比如ssh登錄、ping等等這種單進程比較慢而不耗費cpu的情況
# 還說明了多線程的控制
#———————————————————————————–
function a_sub
{
# 此處定義一個函數,作為一個線程(子進程)
sleep 3 # 線程的作用是sleep 3s
}
tmp_fifofile=「/tmp/$.fifo」 mkfifo $tmp_fifofile # 新建一個fifo類型的文件
exec 6《》$tmp_fifofile # 將fd6指向fifo類型
rm $tmp_fifofile thread=15 # 此處定義線程數
for
((i=0;i《$thread;i++));do echo
done 》&6 # 事實上就是在fd6中放置了$thread個回車符
for
((i=0;i《50;i++));do # 50次循環,可以理解為50個主機,或其他
read -u6 # 一個read -u6命令執行一次,就從fd6中減去一個回車符,然後向下執行,
# fd6中沒有回車符的時候,就停在這了,從而實現了線程數量控制
{ # 此處子進程開始執行,被放到後台
a_sub &&
{ # 此處可以用來判斷子進程的邏輯
echo 「a_sub is finished」
}
||
{ echo 「sub error」
}
echo 》&6 # 當進程結束以後,再向fd6中加上一個回車符,即補上了read -u6減去的那個
}
& done wait # 等待所有的後檯子進程結束
exec 6》&- # 關閉df6 exit 0
說明:
此程序中的命令
mkfifo tmpfile
和linux中的命令
mknod tmpfile p
效?果相同。區別是mkfifo為POSIX標准,因此推薦使用它。該命令創建了一個先入先出的管道文件,並為其分配文件標志符6。管道文件是進程之間通信的一種方式,注意這一句很重要
exec 6《》$tmp_fifofile # 將fd6指向fifo類型
如果沒有這句,在向文件$tmp_fifofile或者&6寫入數據時,程序會被阻塞,直到有read讀出了管道文件中的數據為止。而執行了上面這一句後就可以在程序運行期間不斷向fifo類型的文件寫入數據而不會阻塞,並且數據會被保存下來以供read程序讀出。
通過運行命令:
time 。/multithread.sh 》/dev/null
最終運算時間: 50/15 = 3組(每組15)+1組(5個《15 組成一個組)= 4組,每組花費時間:3秒,
則 3 * 4 = 12 秒。
傳統非多線程的代碼 運算時間: 50 * 3 = 150 秒。
上面就是Linux下shell多線程編程的實例介紹了,使用多線程編程還能夠改善程序結構,有興趣的朋友不妨試試看吧。
㈤ Linux多線程編程
程序代碼test.c共兩個線程,一個主線程,一個讀緩存區的線程:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
char globe_buffer[100];
void *read_buffer_thread(void *arg); //這里先聲明一下讀緩存的線程,具體實現寫在後面了
int main()
{
int res,i;
pthread_t read_thread;
for(i=0;i<20;i++)
globe_buffer[i]=i;
printf("\nTest thread : write buffer finish\n");
sleep(3);\\這里的3秒是多餘,可以不要。
res = pthread_create(&read_thread, NULL, read_buffer_thread, NULL);
if (res != 0)
{
printf("Read Thread creat Error!");
exit(0);
}
sleep(1);
printf("waiting for read thread to finish...\n");
res = pthread_join(read_thread, NULL);
if (res != 0)
{
printf("read thread join failed!\n");
exit(0);
}
printf("read thread test OK, have fun!! exit ByeBye\n");
return 0;
}
void *read_buffer_thread(void *arg)
{
int i,x;
printf("Read buffer thread read data : \n");
for(i=0;i<20;i++)
{
x=globe_buffer[i];
printf("%d ",x);
globe_buffer[i]=0;//清空
}
printf("\nread over\n");
}
---------------------------------------------------------------------------------
以上程序編譯:
gcc -D_REENTRANT test.c -o test.o –lpthread
運行這個程序:
$ ./test.o:
㈥ 陳碩 linux 多線程伺服器編程 上的例子怎樣編譯
Linux多線程程序編譯時記得加上一個-pthread的編譯參數就可以了,不加這個參數就通不過。
㈦ linux創建多線程輸出abcde
創建多線程 - 落日鋼琴家的博客 - CSDN博客 - linux創建多線程
2021年3月28日最簡單的Linux下創建線程的例子 使用pthread_create函數 編譯的時候結尾處多加 -pthread ...
CSDN編程社區
Linux多線程 - Ustinian%的博客 - CSDN博客 - linux創建多線程
5月24日只創建task_struct,將那個創建出來的進程的task_struct和父進程的task_struct共享虛擬地址空間...
CSDN編程社區
㈧ linux下c、c++下多線程編譯
C語言要求除main函數外 所有的函數必須先聲明才能使用 你可以在函數定義的時候一起聲明這個函數 但是在這個函數定義之前不能使用這個函數
下面用通俗點的語言講: 你在main函數中調用了thread函數, 但是如果你把void *thread(void *vargp);刪掉了, 那麼編譯器就找不到這個函數了(因為編譯器是從前往後編譯這個程序的) 因此編譯器是通不過的
有兩種方法, 一種就是像你之前寫的 先聲明這個函數 第二種是把void *thread(void *vargp){...}放到main函數的前面.
有些返回值和參數類型為int型的函數也可以不用聲明, 編譯器也能通過, 不過這是不建議的 也是不符合標準的
標准建議每個函數都應該給出它們的顯式的聲明
希望你懂了 嘿嘿