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

c語言多線程頭文件

發布時間: 2023-05-01 15:06:17

㈠ 高手進,關於c語言在windows上建立多線程的問題(VC6.0上實現)

原因 是 在使用CreateThread 會造成一些 資源的無法釋放 比如c++對象

當然原因不止這些 還很有幾個 詳情 你可以參考windows核心編程

㈡ C語言多線程如何實現

線程之間沒有共享數據,不需要線程同步
你在主函數裡面,把線程銷毀的太快了,線程都沒來得及執行完你就退出了,在創建完線程之後,加個sleep等待幾秒再銷毀線程。
同時注意一下,主進程退出的話,所有線程也會退出。

如果要准確的等待線程執行完再銷毀,可以使用join方法或者共享標志位的方法

㈢ c語言多線程pthread的問題

運行之前需要做一些配置歷好:1.下載PTHREAD的WINDOWS開發包 pthreads-w32-2-4-0-release.exe(任何一個版本均可) http://sourceware.org/pthreads-win32/ ,解壓到一個目錄。2.找到include和lib文件夾,下面分伍爛搏別把它們添加到VC++6.0的頭文件路徑和靜態鏈接庫路徑下面: a).Tools->Options,選擇Directory頁面,然後在Show directories for:中選擇Include files(默認), 在Directories中添加include的路徑。在Show directories for:中選擇Library files, 在Directories中添加lib的路徑。 b).Project->Settings,選腔祥擇Link頁面,然後將lib下的*.lib文件添加到Object/library Moles, 各lib文件以空格隔開。 c).將lib下的*.dll文件復制到工程目錄下,即根目錄。 如果不配置環境,將出現以下錯誤:Linking...
工程名.obj : error LNK2001: unresolved external symbol __imp__pthread_join
工程名.obj : error LNK2001: unresolved external symbol __imp__pthread_create
Debug/工程名.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe. 我自己以前編的一個例子,火車票窗口賣票的 如果不加鎖就會出現-2,-1的問題 這里只是個事例 #include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <windows.h>int piao = 100; void* tprocess1(void* args){

while(piao>0){
Sleep(1);
piao--;
printf("窗口1----------------還剩%d張票\n",piao);
// Sleep(5);
}
return NULL;
}
void* tprocess2(void* args){

while(piao>0){
Sleep(1);
printf("窗口2----------------還剩%d張票\n",piao);
// Sleep(9);
}
return NULL;
}
void* tprocess3(void* args){

while(piao>0){
Sleep(1);
piao--;
printf("窗口3----------------還剩%d張票\n",piao);
// Sleep(10);
}
return NULL;
}
void* tprocess4(void* args){

while(piao>0){
Sleep(1);
piao--;
printf("窗口4----------------還剩%d張票\n",piao);
// Sleep(10);
}
return NULL;
}
int main(){
pthread_t t1;
pthread_t t2;
pthread_t t3;
pthread_t t4;
pthread_create(&t1,NULL,tprocess1,NULL);
pthread_create(&t2,NULL,tprocess2,NULL);
pthread_create(&t3,NULL,tprocess3,NULL);
pthread_create(&t4,NULL,tprocess4,NULL);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
pthread_join(t3,NULL);
pthread_join(t4,NULL);
}

㈣ c語言如何編寫一個簡單的多線程程序

這是一個多線程例子,裡面只有兩個線程,是生產者/消費者模式,已編譯通毀舉宏過,注釋很詳細,x0dx0a如下:x0dx0ax0dx0a/* 以生答蠢產者和消費者模型問題來闡述Linux線程的控制和通信你 x0dx0a 生產者線程將生產的產品送入緩沖區,消費者線程則從中取出產品。x0dx0a 緩沖區有N個,是一個環形的緩沖池。x0dx0a */纖冊x0dx0a#include x0dx0a#include x0dx0ax0dx0a#define BUFFER_SIZE 16x0dx0ax0dx0astruct prodconsx0dx0a{x0dx0a int buffer[BUFFER_SIZE];/*實際存放數據的數組*/x0dx0a pthread_mutex_t lock;/*互斥體lock,用於對緩沖區的互斥操作*/x0dx0a int readpos,writepos; /*讀寫指針*/x0dx0a pthread_cond_t notempty;/*緩沖區非空的條件變數*/x0dx0a pthread_cond_t notfull;/*緩沖區未滿 的條件變數*/x0dx0a};x0dx0ax0dx0a/*初始化緩沖區*/x0dx0avoid pthread_init( struct prodcons *p)x0dx0a{x0dx0a pthread_mutex_init(&p->lock,NULL);x0dx0a pthread_cond_init(&p->notempty,NULL);x0dx0a pthread_cond_init(&p->notfull,NULL);x0dx0a p->readpos = 0;x0dx0a p->writepos = 0;x0dx0a}x0dx0ax0dx0a/*將產品放入緩沖區,這里是存入一個整數*/x0dx0avoid put(struct prodcons *p,int data)x0dx0a{x0dx0a pthread_mutex_lock(&p->lock);x0dx0a /*等待緩沖區未滿*/x0dx0a if((p->writepos +1)%BUFFER_SIZE ==p->readpos)x0dx0a {x0dx0a pthread_cond_wait(&p->notfull,&p->lock);x0dx0a }x0dx0a p->buffer[p->writepos] =data;x0dx0a p->writepos++;x0dx0a if(p->writepos >= BUFFER_SIZE)x0dx0a p->writepos = 0;x0dx0a pthread_cond_signal(&p->notempty);x0dx0a pthread_mutex_unlock(&p->lock);x0dx0a}x0dx0a/*從緩沖區取出整數*/x0dx0aint get(struct prodcons *p)x0dx0a{x0dx0a int data;x0dx0a pthread_mutex_lock(&p->lock);x0dx0a /*等待緩沖區非空*/x0dx0a if(p->writepos == p->readpos)x0dx0a {x0dx0a pthread_cond_wait(&p->notempty ,&p->lock);//非空就設置條件變數notemptyx0dx0a }x0dx0a /*讀書據,移動讀指針*/x0dx0a data = p->buffer[p->readpos];x0dx0a p->readpos++;x0dx0a if(p->readpos == BUFFER_SIZE)x0dx0a p->readpos = 0;x0dx0a /*設置緩沖區未滿的條件變數*/x0dx0a pthread_cond_signal(&p->notfull);x0dx0a pthread_mutex_unlock(&p->lock);x0dx0a return data;x0dx0a}x0dx0a /*測試:生產站線程將1 到1000的整數送入緩沖區,消費者線程從緩沖區中獲取整數,兩者都列印信息*/x0dx0a#define OVER (-1)x0dx0astruct prodcons buffer;x0dx0avoid *procer(void *data)x0dx0a{x0dx0a int n;x0dx0a for( n=0;n<1000;n++)x0dx0a {x0dx0a printf("%d ------>\n",n);x0dx0a put(&buffer,n);x0dx0a }x0dx0a put(&buffer,OVER);x0dx0a return NULL;x0dx0a}x0dx0avoid *consumer(void *data)x0dx0a{x0dx0a int d;x0dx0a while(1)x0dx0a {x0dx0a d = get(&buffer);x0dx0a if(d == OVER)x0dx0a break;x0dx0a elsex0dx0a printf("----->%d\n",d);x0dx0a }x0dx0a return NULL;x0dx0a}x0dx0aint main()x0dx0a{x0dx0a pthread_t th_p,th_c;x0dx0a void *retval;x0dx0a pthread_init(&buffer);x0dx0a pthread_create(&th_p,NULL,procer,0);x0dx0a pthread_create(&th_c,NULL,consumer,0);x0dx0a /*等待兩個線程結束*/x0dx0a pthread_join(th_p, &retval);x0dx0a pthread_join(th_c,&retval);x0dx0a return 0;x0dx0a}

㈤ c語言多線程

因為您傳入的是t的地址:rc = pthread_create(&thread[t], NULL, PrintHello, &t);

所以在PrintHello函數中thread_arg = (int)(*((int*)args));讀取時會讀取到t的最新值,即8.

這是因為主線程一直在執行,for( t = 0; t < NUM_THREADS; t++ )很快執行完,跳出循環t的值為8,而在PrintHello中sleep(1);肯定會讀取到t的最新值8.

直接傳t的值即可,如下:

#include<stdio.h>
#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>//加入這個頭文件
#include<pthread.h>
#include<unistd.h>

#defineNUM_THREADS8

void*PrintHello(void*args)
{
intthread_arg;
sleep(1);
thread_arg=(int)(uintptr_t)args;//這樣讀取傳來的t的值
printf("Hellofromthread%d ",thread_arg);
returnNULL;

}

intmain(void)
{
intrc,t;
pthread_tthread[NUM_THREADS];
for(t=0;t<NUM_THREADS;t++)
{
printf("Creatingthread%d ",t);
rc=pthread_create(&thread[t],NULL,PrintHello,(void*)(uintptr_t)t);//這樣傳t的值
if(rc)
{
printf("ERROR;returncodeis%d ",rc);
returnEXIT_FAILURE;
}
}
sleep(5);
for(t=0;t<NUM_THREADS;t++)
pthread_join(thread[t],NULL);
returnEXIT_SUCCESS;
}

㈥ C語言多線程實現

多線程隨機選號程序
以下程友旦序運行後看起來比較有意思,像一個隨機選號程序,但不是完全按照問題所說的寫的 可供參考,要改很容易

//多線程隨渣告穗機選號程序示例
#include <stdio.h>
#include <Windows.h>
#include <ctime>
#include <cstdlib>
#include <process.h>
bool g_run = true; //是否運行

void userInput(void*) //如卜監視輸入的線程函數
{
while (true)
{
if (getchar()=='\n') //是否輸入回車
{
g_run = !g_run; //回車運行 回車暫停
}
Sleep(10); //延遲
}
}

int main()
{
srand(time(0)); //隨機數種子
_beginthread(userInput,0,NULL); //開線程
while (true)
{
if (g_run)
{
system("cls"); //清屏
int t = rand() % 1000+ 1;//1-1000的隨機數
printf("\n %d",t); //輸出
}
Sleep(50); //延遲50毫秒
}
return 0;
}

㈦ c語言怎麼創建線程和使用

進程的生命周期:
[1].創建 --- fork
[2].執行 --- a. exec
b.子進程實現代碼邏輯
[3].結束 --- exit _exit
僵屍態進程---wait waitpid
孤兒進程
--------------------------------------
進程存在的問題:
(1).進程的創建 --- 復制
(時間 和 空間的開銷很大)
(2).進程的運行 --- 調度-->

㈧ C語言編的程序如何實現多線程運行

unix或linux下可以包含pthread.h頭文陵雹告件
使用pthread_create 函數來創建一個尺明線程
int pthread_create (pthread_t *, const pthread_attr_t *,
void *(*)(void *), void *);

windows下也有windows api可以實現肆仔

㈨ C語言PROCESS.H什麼意思

process.h 是包含用於和宏指令的作用聲明與螺紋和過程一起使用的C標頭文件。 標頭文件的作用是悶祥由二者之一定義的 ANSI/ISO C 標准或 POSIX、多數C編譯器 DOS, 窗口3.1x, Win32, OS/2Novell NetWare或 DOS職能在他們的C程序賀罩物庫里。
多線程相關的時候就需要include <process.h>提供了兩個對多線程進行支持的函禪液數,即線程的創建和終結沒有對線程掛起和恢復進行操作的函數,通常,這兩項功能使用win32 api完成。

㈩ C語言可以實現 中斷 和 多線程 這類功能嗎

「暈,C語言不是灰常強大,無所不能嗎?怎麼有人說C語言不能實現 中斷 和多線程??」這句話要分兩部分來說,首先「暈,C語言不是灰常余殲昌強大,無所不能嗎?」。沒有任何一種語言可以無所不能,原因很簡單,任何的語言都脫離不了編譯工具,而編譯工具脫離不了編譯環境。由於編譯環境的不同,因此編譯工具也有所不同,有得只針對JAVA,有得指針對C++,有得只針對C#。不管C語言多厲害,如果編譯工具不支持,那也沒有辦法在這個編譯工具上編譯,以至於沒有辦法在那個編譯工具的編譯環境中運行。所以不能說無所不能。
「怎麼有人說C語言不能實現改激 中斷 和多線程啊」,這是一個概念性問題。純粹的C語言只是一個工具,更多的是一種定義,一種格式,可以抽象成一種風格。就像定義一個整型變數i。為什麼你不能用integer i定義,非得int i。例如函數的編寫形式,命名規則等等。假如按照C語言的這些規則來編寫程序,同時編譯工具支持C語言,提供中斷庫,還有多線程庫,那麼C語言同樣也可以實現中斷和多線程。舉個例子:例如你手頭上只有一個TC編譯工具,雖然他支持C語言,但是只能編譯16位的DOS程序,礙於這個編譯工具的局限性,所以你永遠也寫不出像Windows操作系統那種帶窗口界面的Win32程序,也不能寫一個針對.NET框架的網路服務程序。同樣的,假如你要開發一個Windows軟體,使用VC編譯器,而這個編譯工具本身帶多線程庫,同時支持Windows系統的很多調用,所以你完全可以以C語言的風格在這個編譯器中調用各種Win32 SDK,開發一個多線程的Windows應用程序。假如你要使用中斷,在Windows環境下可以使用微軟提供的DDK(驅動開發包),他同樣支持C語言,那麼你就可以通過這個開發包調用很多中斷。在Linux環境下,不需要開發包就可以直接調用,因為Linux自帶了很多系統調用都是開放的。頭文件聲明直接就在Linux文件系統的Sys目錄下。所以說他僅僅是一種風格。依賴於編譯環境的系統調用同樣也依賴於編譯環境提供的鏈接豎扒庫。