c語言中的線程
『壹』 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語言線程如何終止
有三種方式可以終止線程,具體調用函數依賴於使用的線程系統。
1 在線程入口函數中,調用return。 即退出線程入口函數,可以實現終止當前線程效果;
2 在線程執行的任意函數,調用當前線程退出函數,可以退出當前線程;
3 在任意位置,調用線程終止函數,並傳入要終止線程的標識符,即pid,可以實現終止對應線程效果。
『叄』 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語言中的線程
給你推薦一些比較好的教程吧,你應該用得著: 漫談臘肢C++ Builder多線程編程技術: http://www.it55.com/html/xueyuan/chengxukaifa/Visual_C__jiaocheng/20070626/7625.html 用MFC編寫多線程程序實例: http://www.it55.com/html/xueyuan/chengxukaifa/Visual_C__jiaocheng/20070626/7647.html C++寫的web伺服器程序(多線程): http://www.it55.com/html/xueyuan/chengxukaifa/Visual_C__jiaocheng/20070911/235269.html 後面輪物世兩個都是多線程的實例教程。螞答
『伍』 c語言怎麼創建線程和使用
進程的生命周期:
[1].創建 --- fork
[2].執行 --- a. exec
b.子進程實現代碼邏輯
[3].結束 --- exit _exit
僵屍態進程---wait waitpid
孤兒進程
--------------------------------------
進程存在的問題:
(1).進程的創建 --- 復制
(時間 和 空間的開銷很大)
(2).進程的運行 --- 調度-->
『陸』 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;i<200000000;i++)
{
;
}
}
}
DWORD WINAPI ThreadProc2( LPVOID lpParam )
{
int i=0,j=0;
while(1)
{
printf("hello,this thread 2 ...\n");
//延時
for(i=0;i<200000000;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;i<200000000;i++)
{;}
}
}
『柒』 c語言實現多線程
目錄:
Linux操作系統,C語言實現多線程
Windows操作系統,C語言實現多線程
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語言如何創建線程(windows)系統中
下面為C語言調用WIN API實現創建線程:
1,導入<windows.h>頭文件
2,聲明實現方法DWORD WINAPI ThreadProc1( LPVOID lpParam ) {}
3,在main()方法中調用 CreateThread(NULL,0 ,ThreadProc1,NULL,0,NULL);
要注意的是主線程不能結束,如果主線程結束,則它的子線程也會被殺死。
#include <windows.h>
#include <stdio.h>
#include<time.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;
//讓主線程進入循環,主線程若退出,子線程1,2會被系統「殺死」
//創建線程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語言多線程的優勢
線程程序作為一種多任務、並發的工作方式,當然有其存在優勢:
提高應用程序響應:
這對圖形界面的程序尤其有意義,當一個操作耗時很長時,整個系統都會等待這個操作,此時程序不會響應鍵盤、滑鼠、菜單的操作,而使用多線程技術,將耗時長的操作(time consuming)置於一個新的線程,可以避免這種尷尬的情況。
使多CPU系統更加有效:
操作系統會保證當線程數不大於CPU數目時,不同的線程運行於不同的CPU上。
改善程序結構:
一個既長又復雜的進程可以考慮分為多個線程,成為幾個獨立或半獨立的運行部分,這樣的程序會利於理解和修改。
『拾』 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函數恢復線程,才能繼續運行.