本文目錄一覽:
- 1、C語言怎麼寫線程代碼
- 2、c語言如何編寫一個簡單的多線程程序?
- 3、C語言如何實現多線程同時運行
- 4、C語言怎樣實現多線程?
- 5、用C語言在windows或者Linux上面,編寫一個多線程程序
- 6、c語言中怎樣創建多線程?
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語言如何編寫一個簡單的多線程程序?
這是一個多線程例子,裡面只有兩個線程,是生產者/消費者模式,已編譯通過,注釋很詳細,
如下:
/* 以生產者和消費者模型問題來闡述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語言如何實現多線程同時運行
1、點擊菜單欄的“Project”選項卡,下拉列表的最後一項“Project options…”是對當前工程的的屬性進行設置的。
2、選擇彈出對話框中的“Compiler”選項卡。
3、將其中的“Runtime Library”的選擇改為“Multithreaded (LIB)”。
4、將看到對話框最下面的文本框中發生了一些變化,新增了“-MT”選項,這與編譯器一開始所報的錯誤提示給出的解決方案一致。
5、頁面的設置完成後,再對該源碼進行編譯時,就能愉快地看到編譯完全成功。
C語言怎樣實現多線程?
首先你要有控制蛇移動方向的全局變量(定義在main以外因為線程函數也要調用它,每次鍵盤輸入都會修改它的值), 比如 char direction ‘a’ ==左 ‘w’ == 右 ‘d’==上 ‘s’ == 下,然後你在移動時應該是在while裡面操作的吧,你每移動一步前都讀一下direction這個變量的數值然後再控制移動方向(注意s這個鍵可以忽略因為不會倒着走) 然後你可以用pthread.h這個庫 例子是 pthread t;// 定義一個線程 pthread_create(t, null, listen_keyboard_input, null);//建立線程執行listen_keyboard_input這個函數 這個線程執行的函數 void listen_keyboard_input(){ while(應該通過某個信號來退出這個循環,從而表示遊戲結束){ direction =getchar(); } } 但是這裡存在同步問題, 比如當這個線程的getchar()在給direction輔助的同時,你控制貪吃蛇移動的線程正在調用 direction的值來判斷下一個移動方向,這就會出問題,所以要加一個鎖,叫 mutex lock;這個也定義成全局變量可以使各線程共享。 pthread_mutex_t mutex; //定義一個鎖 pthread_mutex_init(mutex, null, null);//初始化 然後把函數修改成 void listen_keyboard_input(){ while(應該通過某個信號來退出這個循環,從而表示遊戲結束){ pthread_mutex_lock(mutex); direction =getchar(); pthread_mutex_unlock(mutex); } } 另外一個控制貪吃蛇移動的時候也要加鎖 while(…..){ char c; pthread_mutex_lock(mutex); c = direction; pthread_mutex_unlock(mutex); switch(c){ ……………. } …………………………….. } 這樣就好了 注意你的控制貪吃蛇移動的部分也必須要放在另外一個pthread 裡面執行,如果放在主線程, 主線程會一直等listen_keyboard_input而什麼事都不會做 你把這兩個線程用 pthread_create 創建完成後 用 t1.join(); t2.join(); 就可以使這兩個線程並發執行了 如果你用的是linux 來編譯的,你再輸入gcc 指令後加上 -lpthread 就可以了 還有什麼不懂的你可以多找找 pthread 類的例子
用C語言在windows或者Linux上面,編寫一個多線程程序
#includestdio.h
#includestdlib.h
#includewindows.h
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
int *pt=(int*)lpParam;
printf(“I am tread %d\r\n”,*pt);
}
int main()
{
const int Count=4;
int datas[Count];
DWORD dwThreadId[Count];
HANDLE hThread[Count];
int i;
for(i=0;iCount;i++)
{
datas[i]=i+1;
hThread[i]=CreateThread(NULL,0,ThreadProc,datas[i],0,dwThreadId[i]);
}
WaitForMultipleObjects(Count,hThread,TRUE,INFINITE);
for(i=0;iCount;i++)
{
CloseHandle(hThread[i]);
}
system(“PAUSE”);
return EXIT_SUCCESS;
}
c語言中怎樣創建多線程?
/*這是我寫的最簡單的多線程程序,看懂不?*/
#include windows.h
#include stdio.h
//#include strsafe.h
DWORD WINAPI ThreadProc1( LPVOID lpParam )
{
int i=0,j=0;
while(1)
{
printf(“hello,this thread 1 …\n”);
//延時
for(i=0;i200000000;i++)
{
;
}
}
}
DWORD WINAPI ThreadProc2( LPVOID lpParam )
{
int i=0,j=0;
while(1)
{
printf(“hello,this thread 2 …\n”);
//延時
for(i=0;i200000000;i++)
{
;
}
}
}
void main()
{
int i=0;
//創建線程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
//創建線程2
CreateThread(
NULL, // default security attributes
0, // use default stack size
ThreadProc2, // thread function
NULL, // argument to thread function
0, // use default creation flags
NULL); // returns the thread identifier
//讓主線程進入循環,主線程若退出,子線程1,2會被系統“殺死”
while(1)
{
printf(“hello,this thread 0 …\n”);
//延時
for(i=0;i200000000;i++)
{;}
}
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/156569.html