本文目錄一覽:
C語言怎麼寫線程代碼
通常使用CreateThread函數來創建新的線程.(Unix下使用pthread_create函數)
首先指出,線程與線程之間,是並列關係,不會存在”父子線程”的概念.
在Windows平台下,CreateThread函數包含在 Windows.h 文件內,包含此文件即可正常使用.
以下為CreateThread函數的聲明:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,//指向安全性屬性描述結構體的
//指針,通常可以忽略的.
SIZE_T dwStackSize,//指定新線程初始的棧大小,若不關心,可以用0填充,來要求使用
//默認值
LPTHREAD_START_ROUTINE lpStartAddress,//用來充當線程的函數的指針.
LPVOID lpParameter,//要傳遞給函數的參數,這個值本身就是那個參數,而不是參數的地址
DWORD dwCreationFlags,//創建的方式,0表示正常,創建後立即開始運行
LPDWORD lpThreadId//用來接受函數反饋的線程ID的指針.
);
用來充當新的線程的函數格式:
DWORD WINAPI ThreadProc(LPVOID);
CreateThread函數若成功了,返回新線程的句柄,若失敗了,則返回NULL.
若用CREATE_SUSPENDED填充dwCreation Flags則創建的線程先掛起來,並不直接開始運行,要用ResumeThread函數恢複線程,才能繼續運行.
c語言怎麼創建線程和使用
用 pthread_t創建線程名字。然後pthread_create開闢線程。
具體使用。
比如有一個函數
void *hello()
{
printf(“create pthread!\n”);
}
,然後在main函數裡面調用,
int main()
{
pthread_t a_thread;
pthread_create(a_thread, NULL, (void *)hello, NULL);
}
這樣就完成了hello()函數的創建和使用,接下來hello函數就會在一個線程中運行
c語言如何編寫一個簡單的多線程程序?
這是一個多線程例子,裡面只有兩個線程,是生產者/消費者模式,已編譯通過,注釋很詳細,
如下:
/* 以生產者和消費者模型問題來闡述Linux線程的控制和通信你
生產者線程將生產的產品送入緩衝區,消費者線程則從中取出產品。
緩衝區有N個,是一個環形的緩衝池。
*/
#include stdio.h
#include pthread.h
#define BUFFER_SIZE 16
struct prodcons
{
int buffer[BUFFER_SIZE];/*實際存放數據的數組*/
pthread_mutex_t lock;/*互斥體lock,用於對緩衝區的互斥操作*/
int readpos,writepos; /*讀寫指針*/
pthread_cond_t notempty;/*緩衝區非空的條件變數*/
pthread_cond_t notfull;/*緩衝區未滿 的條件變數*/
};
/*初始化緩衝區*/
void pthread_init( struct prodcons *p)
{
pthread_mutex_init(p-lock,NULL);
pthread_cond_init(p-notempty,NULL);
pthread_cond_init(p-notfull,NULL);
p-readpos = 0;
p-writepos = 0;
}
/*將產品放入緩衝區,這裡是存入一個整數*/
void put(struct prodcons *p,int data)
{
pthread_mutex_lock(p-lock);
/*等待緩衝區未滿*/
if((p-writepos +1)%BUFFER_SIZE ==p-readpos)
{
pthread_cond_wait(p-notfull,p-lock);
}
p-buffer[p-writepos] =data;
p-writepos++;
if(p-writepos = BUFFER_SIZE)
p-writepos = 0;
pthread_cond_signal(p-notempty);
pthread_mutex_unlock(p-lock);
}
/*從緩衝區取出整數*/
int get(struct prodcons *p)
{
int data;
pthread_mutex_lock(p-lock);
/*等待緩衝區非空*/
if(p-writepos == p-readpos)
{
pthread_cond_wait(p-notempty ,p-lock);//非空就設置條件變數notempty
}
/*讀書據,移動讀指針*/
data = p-buffer[p-readpos];
p-readpos++;
if(p-readpos == BUFFER_SIZE)
p-readpos = 0;
/*設置緩衝區未滿的條件變數*/
pthread_cond_signal(p-notfull);
pthread_mutex_unlock(p-lock);
return data;
}
/*測試:生產站線程將1 到1000的整數送入緩衝區,消費者線程從緩衝區中獲取整數,兩者都列印信息*/
#define OVER (-1)
struct prodcons buffer;
void *producer(void *data)
{
int n;
for( n=0;n1000;n++)
{
printf(“%d ——\n”,n);
put(buffer,n);
}
put(buffer,OVER);
return NULL;
}
void *consumer(void *data)
{
int d;
while(1)
{
d = get(buffer);
if(d == OVER)
break;
else
printf(“—–%d\n”,d);
}
return NULL;
}
int main()
{
pthread_t th_p,th_c;
void *retval;
pthread_init(buffer);
pthread_create(th_p,NULL,producer,0);
pthread_create(th_c,NULL,consumer,0);
/*等待兩個線程結束*/
pthread_join(th_p, retval);
pthread_join(th_c,retval);
return 0;
}
c語言實現多線程
目錄:
Linux操作系統,C語言實現多線程
Windows操作系統,C語言實現多線程
Windows下的多線程(不帶停止)
Linux操作系統,C語言實現多線程:
#include stdio.h
#include stdlib.h
#include pthread.h
void * ThreadOne ( void * threadArg )
{
printf ( “線程開始啦,參數是:%s\n” , (char *)threadArg );
return NULL;
}
int main ( void )
{
pthread_t ThreadID; /* 記錄線程標識符 */
void * waitingResult; /* 等待線程退出的等待結果 */
int errorCode; /* 記錄線程的錯誤代碼 */
char * aMessage = “這是線程的參數” ;
/* 創建並啟動線程ThreadOne。若返回值非零,則線程創建失敗 */
errorCode = pthread_create( ThreadID, NULL, ThreadOne, aMessage );
if ( errorCode != 0 )
{
printf (“線程ThreadOne創建失敗。錯誤代碼:%d\n”, errorCode );
return EXIT_FAILURE ;
}
/* 等待線程標識符為的ThreadID的線程結束 */
errorCode = pthread_join( ThreadID, waitingResult );
if ( errorCode != 0 )
{
printf ( “等待線程退出等待失敗。錯誤代碼:%d\n” , errorCode ) ;
return EXIT_FAILURE ;
}
printf( “線程的返回值是%p\n”, waitingResult );
return EXIT_SUCCESS ;
}
Windows操作系統,C語言實現多線程:
#include stdio.h
#include windows.h
DWORD APIENTRY ThreadOne ( LPVOID threadArg )
{
printf ( “線程開始啦,參數是:%s\n” , (char *)threadArg );
return 0;
}
int main ( void )
{
HANDLE hThread; /* 記錄線程句柄 */
DWORD ThreadID; /* 記錄線程ID號 */
DWORD waitingResult; /* 等待線程退出的等待結果 */
DWORD threadExitCode; /* 記錄線程的返回值 */
char * aMessage = “這是線程的參數” ;
/* 創建並啟動線程ThreadOne,返回值為線程句柄,賦值給hThread */
hThread = CreateThread ( NULL, 0L, ThreadOne, (LPVOID)aMessage, 0L, ThreadID );
if ( hThread == NULL )
{
printf (“線程ThreadOne創建失敗。錯誤代碼:%lu\n”, GetLastError() );
return EXIT_FAILURE ;
}
/* 等待線程句柄為的hThread線程結束 */
waitingResult = WaitForSingleObject ( hThread, INFINITE );
if ( waitingResult == WAIT_FAILED )
{
printf ( “等待線程退出等待失敗。錯誤代碼:%lu\n” , GetLastError() ) ;
return EXIT_FAILURE ;
}
if ( GetExitCodeThread ( hThread , threadExitCode ) )
printf ( “線程的返回值是%lu\n”, threadExitCode ) ;
else
printf ( “獲取線程的返回值獲取失敗。錯誤代碼:%lu\n” , GetLastError() ) ;
return EXIT_SUCCESS ;
}
Windows下的多線程:(不帶停止)
#include stdio.h
#include windows.h
DWORD WINAPI duoxianchen(LPVOID lpParam);
int main(int argc, char *argv[])
{
int num=0;
CreateThread(NULL,NULL,duoxianchen,num,NULL, NULL);
while(1)
{
num++;
printf(“主線程! %05d\n”,nu***eep(40);
}
return 0;
}
DWORD WINAPI duoxianchen(LPVOID lpParam)
{
int* a=lpParam;
while(1)
{
++*a;
printf(“副線程! %05d 0x%p\n”,*a,a);
Sleep(80);
}
return 0;
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/187559.html