c語(yǔ)言創(chuàng)建線程的函數(shù) c語(yǔ)言創(chuàng)建線程的函數(shù)怎么寫

c語(yǔ)言怎么創(chuàng)建線程和使用

用 pthread_t創(chuàng)建線程名字。然后pthread_create開辟線程。

成都創(chuàng)新互聯(lián)公司是專業(yè)的賓川網(wǎng)站建設(shè)公司,賓川接單;提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行賓川網(wǎng)站開發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!

具體使用。

比如有一個(gè)函數(shù)

void *hello()

{

printf("create pthread!\n");

}

,然后在main函數(shù)里面調(diào)用,

int main()

{

pthread_t a_thread;

pthread_create(a_thread, NULL, (void *)hello, NULL);

}

這樣就完成了hello()函數(shù)的創(chuàng)建和使用,接下來(lái)hello函數(shù)就會(huì)在一個(gè)線程中運(yùn)行

請(qǐng)問(wèn)用C語(yǔ)言在windows上建立多線程需要用什么函數(shù)最好,

#includewindows.h

#includefstream.h

#includestdio.h

#includestring

#includeconio.h

//定義一些常量;

//本程序允許的最大臨界區(qū)數(shù);

#define MAX_BUFFER_NUM 10

//秒到微秒的乘法因子;

#define INTE_PER_SEC 1000

//本程序允許的生產(chǎn)和消費(fèi)線程的總數(shù);

#define MAX_THREAD_NUM 64

//定義一個(gè)結(jié)構(gòu),記錄在測(cè)試文件中指定的每一個(gè)線程的參數(shù)

struct ThreadInfo

{

int serial; //線程序列號(hào)

char entity; //是P還是C

double delay; //線程延遲

int thread_request[MAX_THREAD_NUM]; //線程請(qǐng)求隊(duì)列

int n_request; //請(qǐng)求個(gè)數(shù)

};

//全局變量的定義

//臨界區(qū)對(duì)象的聲明,用于管理緩沖區(qū)的互斥訪問(wèn);

CRITICAL_SECTION PC_Critical[MAX_BUFFER_NUM];

int Buffer_Critical[MAX_BUFFER_NUM]; //緩沖區(qū)聲明,用于存放產(chǎn)品;

HANDLE h_Thread[MAX_THREAD_NUM]; //用于存儲(chǔ)每個(gè)線程句柄的數(shù)組;

ThreadInfo Thread_Info[MAX_THREAD_NUM]; //線程信息數(shù)組;

HANDLE empty_semaphore; //一個(gè)信號(hào)量;

HANDLE h_mutex; //一個(gè)互斥量;

DWORD n_Thread = 0; //實(shí)際的線程的數(shù)目;

DWORD n_Buffer_or_Critical; //實(shí)際的緩沖區(qū)或者臨界區(qū)的數(shù)目;

HANDLE h_Semaphore[MAX_THREAD_NUM]; //生產(chǎn)者允許消費(fèi)者開始消費(fèi)的信號(hào)量;

//生產(chǎn)消費(fèi)及輔助函數(shù)的聲明

void Produce(void *p);

void Consume(void *p);

bool IfInOtherRequest(int);

int FindProducePositon();

int FindBufferPosition(int);

int main(void)

{

//聲明所需變量;

DWORD wait_for_all;

ifstream inFile;

//初始化緩沖區(qū);

for(int i=0;i MAX_BUFFER_NUM;i++)

Buffer_Critical[i] = -1;

//初始化每個(gè)線程的請(qǐng)求隊(duì)列;

for(int j=0;jMAX_THREAD_NUM;j++){

for(int k=0;kMAX_THREAD_NUM;k++)

Thread_Info[j].thread_request[k] = -1;

Thread_Info[j].n_request = 0;

}

//初始化臨界區(qū);

for(i =0;i MAX_BUFFER_NUM;i++)

InitializeCriticalSection(PC_Critical[i]);

//打開輸入文件,按照規(guī)定的格式提取線程等信息;

inFile.open("test.txt");

//從文件中獲得實(shí)際的緩沖區(qū)的數(shù)目;

inFile n_Buffer_or_Critical;

inFile.get();

printf("輸入文件是:\n");

//回顯獲得的緩沖區(qū)的數(shù)目信息;

printf("%d \n",(int) n_Buffer_or_Critical);

//提取每個(gè)線程的信息到相應(yīng)數(shù)據(jù)結(jié)構(gòu)中;

while(inFile){

inFile Thread_Info[n_Thread].serial;

inFile Thread_Info[n_Thread].entity;

inFile Thread_Info[n_Thread].delay;

char c;

inFile.get(c);

while(c!='\n' !inFile.eof()){

inFile Thread_Info[n_Thread].thread_request[Thread_Info[n_Thread].n_request++];

inFile.get(c);

}

n_Thread++;

}

//回顯獲得的線程信息,便于確認(rèn)正確性;

for(j=0;j(int) n_Thread;j++){

int Temp_serial = Thread_Info[j].serial;

char Temp_entity = Thread_Info[j].entity;

double Temp_delay = Thread_Info[j].delay;

printf(" \n thread%2d %c %f ",Temp_serial,Temp_entity,Temp_delay);

int Temp_request = Thread_Info[j].n_request;

for(int k=0;kTemp_request;k++)

printf(" %d ", Thread_Info[j].thread_request[k]);

coutendl;

}

printf("\n\n");

//創(chuàng)建在模擬過(guò)程中幾個(gè)必要的信號(hào)量

empty_semaphore=CreateSemaphore(NULL,n_Buffer_or_Critical,n_Buffer_or_Critical,

"semaphore_for_empty");

h_mutex = CreateMutex(NULL,FALSE,"mutex_for_update");

//下面這個(gè)循環(huán)用線程的ID號(hào)來(lái)為相應(yīng)生產(chǎn)線程的產(chǎn)品讀寫時(shí)所

//使用的同步信號(hào)量命名;

for(j=0;j(int)n_Thread;j++){

std::string lp ="semaphore_for_produce_";

int temp =j;

while(temp){

char c = (char)(temp%10);

lp+=c;

temp/=10;

}

h_Semaphore[j+1]=CreateSemaphore(NULL,0,n_Thread,lp.c_str());

}

//創(chuàng)建生產(chǎn)者和消費(fèi)者線程;

for(i =0;i (int) n_Thread;i++){

if(Thread_Info[i].entity =='P')

h_Thread[i]= CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Produce),

(Thread_Info[i]),0,NULL);

else

h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Consume),

(Thread_Info[i]),0,NULL);

}

//主程序等待各個(gè)線程的動(dòng)作結(jié)束;

wait_for_all = WaitForMultipleObjects(n_Thread,h_Thread,TRUE,-1);

printf(" \n \nALL Producer and consumer have finished their work. \n");

printf("Press any key to quit!\n");

_getch();

return 0;

}

//確認(rèn)是否還有對(duì)同一產(chǎn)品的消費(fèi)請(qǐng)求未執(zhí)行;

bool IfInOtherRequest(int req)

{

for(int i=0;in_Thread;i++)

for(int j=0;jThread_Info[i].n_request;j++)

if(Thread_Info[i].thread_request[j] == req)

return TRUE;

return FALSE;

}

//找出當(dāng)前可以進(jìn)行產(chǎn)品生產(chǎn)的空緩沖區(qū)位置;

int FindProducePosition()

{

int EmptyPosition;

for (int i =0;in_Buffer_or_Critical;i++)

if(Buffer_Critical[i] == -1){

EmptyPosition = i;

//用下面這個(gè)特殊值表示本緩沖區(qū)正處于被寫狀態(tài);

Buffer_Critical[i] = -2;

break;

}

return EmptyPosition;

}

//找出當(dāng)前所需生產(chǎn)者生產(chǎn)的產(chǎn)品的位置;

int FindBufferPosition(int ProPos)

{

int TempPos;

for (int i =0 ;in_Buffer_or_Critical;i++)

if(Buffer_Critical[i]==ProPos){

TempPos = i;

break;

}

return TempPos;

}

//生產(chǎn)者進(jìn)程

void Produce(void *p)

{

//局部變量聲明;

DWORD wait_for_semaphore,wait_for_mutex,m_delay;

int m_serial;

//獲得本線程的信息;

m_serial = ((ThreadInfo*)(p))-serial;

m_delay = (DWORD)(((ThreadInfo*)(p))-delay *INTE_PER_SEC);

Sleep(m_delay);

//開始請(qǐng)求生產(chǎn)

printf("Producer %2d sends the produce require.\n",m_serial);

//確認(rèn)有空緩沖區(qū)可供生產(chǎn),同時(shí)將空位置數(shù)empty減1;用于生產(chǎn)者和消費(fèi)者的同步;

wait_for_semaphore = WaitForSingleObject(empty_semaphore,-1);

//互斥訪問(wèn)下一個(gè)可用于生產(chǎn)的空臨界區(qū),實(shí)現(xiàn)寫寫互斥;

wait_for_mutex = WaitForSingleObject(h_mutex,-1);

int ProducePos = FindProducePosition();

ReleaseMutex(h_mutex);

//生產(chǎn)者在獲得自己的空位置并做上標(biāo)記后,以下的寫操作在生產(chǎn)者之間可以并發(fā);

//核心生產(chǎn)步驟中,程序?qū)⑸a(chǎn)者的ID作為產(chǎn)品編號(hào)放入,方便消費(fèi)者識(shí)別;

printf("Producer %2d begin to produce at position %2d.\n",m_serial,ProducePos);

Buffer_Critical[ProducePos] = m_serial;

printf("Producer %2d finish producing :\n ",m_serial);

printf(" position[ %2d ]:%3d \n" ,ProducePos,Buffer_Critical[ProducePos]);

//使生產(chǎn)者寫的緩沖區(qū)可以被多個(gè)消費(fèi)者使用,實(shí)現(xiàn)讀寫同步;

ReleaseSemaphore(h_Semaphore[m_serial],n_Thread,NULL);

}

//消費(fèi)者進(jìn)程

void Consume(void * p)

{

//局部變量聲明;

DWORD wait_for_semaphore,m_delay;

int m_serial,m_requestNum; //消費(fèi)者的序列號(hào)和請(qǐng)求的數(shù)目;

int m_thread_request[MAX_THREAD_NUM];//本消費(fèi)線程的請(qǐng)求隊(duì)列;

//提取本線程的信息到本地;

m_serial = ((ThreadInfo*)(p))-serial;

m_delay = (DWORD)(((ThreadInfo*)(p))-delay *INTE_PER_SEC);

m_requestNum = ((ThreadInfo *)(p))-n_request;

for (int i = 0;im_requestNum;i++)

m_thread_request[i] = ((ThreadInfo*)(p))-thread_request[i];

Sleep(m_delay);

//循環(huán)進(jìn)行所需產(chǎn)品的消費(fèi)

for(i =0;im_requestNum;i++){

//請(qǐng)求消費(fèi)下一個(gè)產(chǎn)品

printf("Consumer %2d request to consume %2d product\n",m_serial,m_thread_request[i]);

//如果對(duì)應(yīng)生產(chǎn)者沒有生產(chǎn),則等待;如果生產(chǎn)了,允許的消費(fèi)者數(shù)目-1;實(shí)現(xiàn)了讀寫同步;

wait_for_semaphore=WaitForSingleObject(h_Semaphore[m_thread_request[i]],-1);

//查詢所需產(chǎn)品放到緩沖區(qū)的號(hào)

int BufferPos=FindBufferPosition(m_thread_request[i]);

//開始進(jìn)行具體緩沖區(qū)的消費(fèi)處理,讀和讀在該緩沖區(qū)上仍然是互斥的;

//進(jìn)入臨界區(qū)后執(zhí)行消費(fèi)動(dòng)作;并在完成此次請(qǐng)求后,通知另外的消費(fèi)者本處請(qǐng)求已

//經(jīng)滿足;同時(shí)如果對(duì)應(yīng)的產(chǎn)品使用完畢,就做相應(yīng)處理;并給出相應(yīng)動(dòng)作的界面提

//示;該相應(yīng)處理指將相應(yīng)緩沖區(qū)清空,并增加代表空緩沖區(qū)的信號(hào)量;

EnterCriticalSection(PC_Critical[BufferPos]);

printf("Consumer%2d begin to consume %2d product \n",m_serial,m_thread_request[i]);

((ThreadInfo*)(p))-thread_request[i] =-1;

if(!IfInOtherRequest(m_thread_request[i])){

Buffer_Critical[BufferPos] = -1;//標(biāo)記緩沖區(qū)為空;

printf("Consumer%2d finish consuming %2d:\n ",m_serial,m_thread_request[i]);

printf(" position[ %2d ]:%3d \n" ,BufferPos,Buffer_Critical[BufferPos]);

ReleaseSemaphore(empty_semaphore,1,NULL);

}

else{

printf("Consumer %2d finish consuming product %2d\n ",m_serial,m_thread_request[i]);

}

//離開臨界區(qū)

LeaveCriticalSection(PC_Critical[BufferPos]);

}

}

看函數(shù)就行

C語(yǔ)言怎么寫線程代碼

通常使用CreateThread函數(shù)來(lái)創(chuàng)建新的線程.(Unix下使用pthread_create函數(shù))

首先指出,線程與線程之間,是并列關(guān)系,不會(huì)存在"父子線程"的概念.

在Windows平臺(tái)下,CreateThread函數(shù)包含在 Windows.h 文件內(nèi),包含此文件即可正常使用.

以下為CreateThread函數(shù)的聲明:

HANDLE CreateThread(

LPSECURITY_ATTRIBUTES lpThreadAttributes,//指向安全性屬性描述結(jié)構(gòu)體的

//指針,通??梢院雎缘?

SIZE_T dwStackSize,//指定新線程初始的棧大小,若不關(guān)心,可以用0填充,來(lái)要求使用

//默認(rèn)值

LPTHREAD_START_ROUTINE lpStartAddress,//用來(lái)充當(dāng)線程的函數(shù)的指針.

LPVOID lpParameter,//要傳遞給函數(shù)的參數(shù),這個(gè)值本身就是那個(gè)參數(shù),而不是參數(shù)的地址

DWORD dwCreationFlags,//創(chuàng)建的方式,0表示正常,創(chuàng)建后立即開始運(yùn)行

LPDWORD lpThreadId//用來(lái)接受函數(shù)反饋的線程ID的指針.

);

用來(lái)充當(dāng)新的線程的函數(shù)格式:

DWORD WINAPI ThreadProc(LPVOID);

CreateThread函數(shù)若成功了,返回新線程的句柄,若失敗了,則返回NULL.

若用CREATE_SUSPENDED填充dwCreation Flags則創(chuàng)建的線程先掛起來(lái),并不直接開始運(yùn)行,要用ResumeThread函數(shù)恢復(fù)線程,才能繼續(xù)運(yùn)行.

C語(yǔ)言如何創(chuàng)建線程(windows)系統(tǒng)中

下面為C語(yǔ)言調(diào)用WIN API實(shí)現(xiàn)創(chuàng)建線程:

1,導(dǎo)入windows.h頭文件

2,聲明實(shí)現(xiàn)方法DWORD WINAPI ThreadProc1( LPVOID lpParam ) {}

3,在main()方法中調(diào)用 CreateThread(NULL,0 ,ThreadProc1,NULL,0,NULL);

要注意的是主線程不能結(jié)束,如果主線程結(jié)束,則它的子線程也會(huì)被殺死。

#include windows.h

#include stdio.h

#includetime.h

DWORD WINAPI ThreadProc1( LPVOID lpParam )

{

int i=0;

time_t timer;

while(1)

{

timer=time(NULL);

printf("The current time is: %s\n",asctime(localtime(timer)));

sleep(1);

}

}

void main()

{

int i=0;

//讓主線程進(jìn)入循環(huán),主線程若退出,子線程1,2會(huì)被系統(tǒng)“殺死”

//創(chuàng)建線程1

CreateThread(

NULL, // default security attributes

0, // use default stack size

ThreadProc1, // thread function

NULL, // argument to thread function

0, // use default creation flags

NULL); // returns the thread identifier

for()

{

;

}

}

文章名稱:c語(yǔ)言創(chuàng)建線程的函數(shù) c語(yǔ)言創(chuàng)建線程的函數(shù)怎么寫
標(biāo)題網(wǎng)址:http://muchs.cn/article28/ddiiejp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站微信公眾號(hào)、云服務(wù)器服務(wù)器托管、企業(yè)網(wǎng)站制作、軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

綿陽(yáng)服務(wù)器托管