當前位置:首頁 » 編程語言 » c語言多線程傳遞參數
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言多線程傳遞參數

發布時間: 2022-12-18 13:37:09

c語言線程函數參數問題

·線程創建
函數原型:int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr,void *(*start_rtn)(void),void *restrict arg);
返回值:若是成功建立線程返回0,否則返回錯誤的編號。

形式參數:pthread_t *restrict tidp要創建的線程的線程id指針;
const pthread_attr_t *restrict attr創建線程時的線程屬性;
void* (start_rtn)(void)返回值是void類型的指針函數;
void *restrict arg start_rtn的形參。 =====這個地方就可以傳參數,
注意,這個地方是個指針,要想傳多個參數,可以定義一個結構體,把要傳的參數包起來,傳結構體的地址就ok

Ⅱ (C語言)多線程beginthreadex的第四個參數(結構體)到底怎麼設置才能正確傳遞數值

第四個參數的類型是LPVOID(long型指針),可以進行任意類型的轉換,具體函數傳參可以參考http://blog.csdn.net/morewindows/article/details/7421759。

Ⅲ 多線程如何傳遞多個參數

將參數放入結構體
例如:
struct someS
{
// 要傳遞的參數
};

someS *ss = new someS;
// 然後對參數進行賦值

// 傳遞這些參數
CreateThread(……,……,……,(LPVOID)ss,……,……);

Ⅳ C語言中 怎麼實現雙線程 或者 父子線程啊

運行一個程序,這個運行實體就是一個「進程」。

例如,用滑鼠雙擊IE瀏覽器的圖標,你運行了一個IE「進程」。第一個窗未關,你又用滑鼠雙擊IE瀏覽器的圖標,又出來一個瀏覽器的窗。這時,你運行了同一個程序的兩個進程。

對於自己寫的程序也如此。運行它,這個運行實體就是一個「進程」。同時運行兩個,就是兩個進程。計算機分別對兩個進程分配資源,直到進程結束,收回資源。

線程是進程里真真跑的線路,真真執行的運算,每個進程有一個主線程。進程里可以開第二第三條新的執行線路,gcc 用 pthread_create(),VC++ 用 CreateThread(), 這就叫雙線程和多線程。進程是線程的容器,同一進程的線程共享它們進程的資源。線程里建的線程就是父子線程。

兩個或多個進程協同工作時,需要互相交換信息,有些情況下進程間交換的少量信息,有些情況下進程間交換大批信息。這就要通訊。通訊方式不止一種。管道就是一種。VC++ 用 CreatePipe() 函數建立。

管道的實質是一個共享文件,可藉助於文件系統的機制實現,創建、打開、關閉和讀寫.

一個進程正在使用某個管道寫入或讀出數據時,另一個進程就必須等待. 發送者和接收者雙方必須知道對方是否存在,如果對方已經不存在,就沒有必要再發送信息.,發送信息和接收信息之間要協調,當寫進程把一定數量的數據寫入管道,就去睡眠等待,直到讀進程取走數據後,把它喚醒。

VC++ 線程例子:
#include <windows.h>
#include <iostream.h>

DWORD WINAPI fun1(LPVOID lp);
DWORD WINAPI fun2(LPVOID lp);
int piao=500;

int main()
{
HANDLE pthread1,pthread2;
pthread1=CreateThread(0,0,fun1,0,0,0);
pthread2=CreateThread(0,0,fun2,0,0,0);
CloseHandle(pthread1);
CloseHandle(pthread2);
Sleep(3000);
return 0;

}

DWORD WINAPI fun1(LPVOID lp)
{
while(1)
{

if(piao>0)
cout<< "thread-1-"<< piao--<<endl;
else
break;
}
return 0;
}

DWORD WINAPI fun2(LPVOID lp)
{
while(1)
{
if(piao>0)
cout<<"thread-2-"<<piao--<<endl;
else
break;
}
return 0;
}

===================================
建管道函數原形:
BOOL CreatePipe(
PHANDLE hReadPipe, // read handle
PHANDLE hWritePipe, // write handle
LPSECURITY_ATTRIBUTES lpPipeAttributes, // security attributes
DWORD nSize // pipe size
);

Ⅳ 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;
}

矩陣的計算我忘記了,你運行看看結果對不對

Ⅵ c語言實現多線程

目錄:

  1. Linux操作系統,C語言實現多線程

  2. Windows操作系統,C語言實現多線程

  3. Windows下的多線程(不帶停止)

Linux操作系統,C語言實現多線程:

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
void*ThreadOne(void*threadArg)
{
printf("線程開始啦,參數是:%s ",(char*)threadArg);
returnNULL;
}
intmain(void)
{
pthread_tThreadID;/*記錄線程標識符*/
void*waitingResult;/*等待線程退出的等待結果*/
interrorCode;/*記錄線程的錯誤代碼*/
char*aMessage="這是線程的參數";
/*創建並啟動線程ThreadOne。若返回值非零,則線程創建失敗*/
errorCode=pthread_create(&ThreadID,NULL,ThreadOne,aMessage);
if(errorCode!=0)
{
printf("線程ThreadOne創建失敗。錯誤代碼:%d ",errorCode);
returnEXIT_FAILURE;
}
/*等待線程標識符為的ThreadID的線程結束*/
errorCode=pthread_join(ThreadID,&waitingResult);
if(errorCode!=0)
{
printf("等待線程退出等待失敗。錯誤代碼:%d ",errorCode);
returnEXIT_FAILURE;
}
printf("線程的返回值是%p ",waitingResult);
returnEXIT_SUCCESS;
}

Windows操作系統,C語言實現多線程:

#include<stdio.h>
#include<windows.h>
DWORDAPIENTRYThreadOne(LPVOIDthreadArg)
{
printf("線程開始啦,參數是:%s ",(char*)threadArg);
return0;
}
intmain(void)
{
HANDLEhThread;/*記錄線程句柄*/
DWORDThreadID;/*記錄線程ID號*/
DWORDwaitingResult;/*等待線程退出的等待結果*/
DWORDthreadExitCode;/*記錄線程的返回值*/
char*aMessage="這是線程的參數";
/*創建並啟動線程ThreadOne,返回值為線程句柄,賦值給hThread*/
hThread=CreateThread(NULL,0L,ThreadOne,(LPVOID)aMessage,0L,&ThreadID);
if(hThread==NULL)
{
printf("線程ThreadOne創建失敗。錯誤代碼:%lu ",GetLastError());
returnEXIT_FAILURE;
}
/*等待線程句柄為的hThread線程結束*/
waitingResult=WaitForSingleObject(hThread,INFINITE);
if(waitingResult==WAIT_FAILED)
{
printf("等待線程退出等待失敗。錯誤代碼:%lu ",GetLastError());
returnEXIT_FAILURE;
}
if(GetExitCodeThread(hThread,&threadExitCode))
printf("線程的返回值是%lu ",threadExitCode);
else
printf("獲取線程的返回值獲取失敗。錯誤代碼:%lu ",GetLastError());
returnEXIT_SUCCESS;
}

Windows下的多線程:(不帶停止)

#include<stdio.h>
#include<windows.h>
DWORDWINAPIoxianchen(LPVOIDlpParam);
intmain(intargc,char*argv[])
{
intnum=0;
CreateThread(NULL,NULL,oxianchen,&num,NULL,NULL);
while(1)
{
num++;
printf("主線程!%05d ",nu***eep(40);
}
return0;
}
DWORDWINAPIoxianchen(LPVOIDlpParam)
{
int*a=lpParam;
while(1)
{
++*a;
printf("副線程!%05d0x%p ",*a,a);
Sleep(80);
}
return0;
}

Ⅶ C# 中怎麼使用帶參數的多線程呢

寒。。。樓上怎麼就直接抄msdn的代碼呢。。。
msdn的代碼很不好看的。。。
樓主我幫你寫了個例子,你自己看看就明白了。:

struct IpAndPort
{
public string Ip;
public int Port;
}

private void Form1_Load(object sender, EventArgs e)
{
Thread thr = new Thread(a);
IpAndPort aa = new IpAndPort();
aa.Ip = "123.123.123.123";
aa.Port = 123;
thr.Start((object)aa);
}

private void a(object aa)
{
IpAndPort ip = (IpAndPort)aa;
MessageBox.Show(ip.Ip + ":" + ip.Port.ToString());
}

註:參數必須是object型的,並且只能一個。其他類型的可以通過顯式轉換成object型,然後在線程方法里再轉回來。
如果有多個變數則可以自己定義一個struct或者類,然後轉換成object型,然後在線程方法里再轉回來。

另ThreadStart是沒有參數的,要使用帶參數的方法這樣使用:
Thread thr = new Thread(a);
而不是
Thread thr = new Thread(new ThreadStart(a));

Ⅷ C語言如何實現多線程同時運行

1、點擊菜單欄的「Project」選項卡,下拉列表的最後一項「Project options...」是對當前工程的的屬性進行設置的。