編譯pthread
Ⅰ linux多線程編譯中為什麼說pthread_create未定義
問題描述說的太簡單了,完全無法回答嘛
至少把出錯信息完整的帖一遍阿
循環接收有兩種方法:多線程+同步接收 ; 單線程+非同步接收
其實非同步接收也不是單線程,只是需要你管理的線程只有一個而已
Ⅱ c++編譯pthread程序命令行怎麼寫
shibixiao | 六級lpthread是表示要連接到pthread的庫是這里省略的lib,你應該可以找到共享庫libpthread.so的因為pthread編程用到的函數在pthread庫裡面,就像你使用pow等數學計算函數,需要用到math.h需要 -lm
Ⅲ 用命令mn查找線程函數pthread-creat,在編譯此類程序時鏈接應寫成什麼
pthread_create未定義的問題已解決我現在的問題是什麼是同步接收+多線程和問題描述說的太簡單了,完全無法回答嘛 至少把出錯信息完整的帖一遍阿 循環
Ⅳ linux系統下,c語言pthread多線程編程傳參問題
3個線程使用的都是同一個info
代碼 Info_t *info= (Info_t *)malloc(sizeof(Info_t));只創建了一個info
pthread_create(&threads[i],NULL,calMatrix,(void *)info); 三個線程使用的是同一個
我把你的代碼改了下:
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
intmtc[3]={0};//resultmatrix
typedefstruct
{
intprank;
int*mta;
int*mtb;
}Info_t;
void*calMatrix(void*arg)
{
inti;
Info_t*info=(Info_t*)arg;
intprank=info->prank;
fprintf(stdout,"calMatrix:prankis%d ",prank);
for(i=0;i<3;i++)
mtc[prank]+=info->mta[i]*info->mtb[i];
returnNULL;
}
intmain(intargc,char**argv)
{
inti,j,k=0;
intmta[3][3];
intmtb[3]={1};
Info_t*info=(Info_t*)malloc(sizeof(Info_t)*3);
for(i=0;i<3;i++)
for(j=0;j<3;j++)
mta[i][j]=k++;
/*3threads*/
pthread_t*threads=(pthread_t*)malloc(sizeof(pthread_t)*3);
fprintf(stdout," ");fflush(stdout);
for(i=0;i<3;i++)
{
info[i].prank=i;
info[i].mta=mta[i];
info[i].mtb=mtb;
pthread_create(&threads[i],NULL,calMatrix,(void*)(&info[i]));
}
for(i=0;i<3;i++)
pthread_join(threads[i],NULL);
fprintf(stdout," ====thematrixresult==== ");
fflush(stdout);
for(i=0;i<3;i++)
{
fprintf(stdout,"mtc[%d]=%d ",i,mtc[i]);
fflush(stdout);
}
return0;
}
矩陣的計算我忘記了,你運行看看結果對不對
Ⅳ gcc 編譯選項 -pthread -lpthread 異同
-pthread 比 -lpthread 多了一個宏定義 -D_REENTRANT
對於多線程程序來說這個宏非常重要,這個宏會讓libc和一些其他庫,自動選擇線程安全的函數實現(很多函數有線程安全和不安全的2種實現版本)
所以建議使用-pthread 或者加上 -D_REENTRANT.
Ⅵ gcc編譯線程程序,為什麼要加-lpthread,頭文件已經包含了<pthread.h>了啊
-lpthread是鏈接庫,
<pthread.h>只有申明,實現部分都在庫裡面。
創建線程時一般是把函數的指針做參數,所以要加一個取地址符號。
ret=pthread_create(&id,NULL,(void *)&thread,NULL);
另外,建議要檢查一下創建線程的返回值ret是否成功,防止影響後面的代碼。
(6)編譯pthread擴展閱讀:
每個語言編譯器都是獨立程序,此程序可處理輸入的原始碼,並輸出組合語言碼。全部的語言編譯器都擁有共通的中介架構:一個前端解析符合此語言的原始碼,並產生一抽象語法樹,以及一翻譯此語法樹成為GCC的暫存器轉換語言〈RTL〉的後端。
編譯器最佳化與靜態程序碼解析技術(例如FORTIFY_SOURCE,一個試圖發現緩沖區溢位〈buffer overflow〉的編譯器)在此階段應用於程序碼上。最後,適用於此硬體架構的組合語言程序碼以Jack Davidson與Chris Fraser發明的演算法產出。
Ⅶ 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);
Ⅷ 一個做兩個矩陣乘法的 pthread 程序,能通過編譯,運行報「segmentation fault」。
void*func(void*arg)
{
inti,j,k;
thread_info_t*info;
i=info->i;
j=info->j;
C[i][j]=0;
for(k=0;k<16;k++)//k是a的列數,b的行數
C[i][j]=C[i][j]+A[i][k]*B[k][j];
}
這個函數里的參數arg沒有用到,你聲明了一個指針info,沒有初始化內容然後就直接使用了info->i,這樣會出錯
加一句info = (thread_info_t *)arg;
試試看