第一部分代碼 CreateThread();
線程傳值線程返回pid
#include <Windows.h>
#include <iostream>
//傳值 返回進程id
DWORD WINAPI ThreadFun(LPVOID pm)
{
std::cout<<*((int*)pm)<<"\nhello world!!!\n"<<GetCurrentThreadId()<<std::endl;
return 0;
}
int main()
{
printf("最簡單的創建多線程實例\n");
DWORD m=NULL;
int* x=new int(13);
HANDLE handler =CreateThread(NULL,0,ThreadFun,x,0,&m);
WaitForSingleObject(handler,INFINITE);
printf("進程ID爲%d\n",m);
system("pause");
delete x;
return 0;
}
此段內容複製的
_beginthreadex()函數在創建新線程時會分配並初始化一個_tiddata塊。這個_tiddata塊自然是用來存放一些需要線程獨享的數據。事實上新線程運行時會首先將_tiddata塊與自己進一步關聯起來。然後新線程調用標準C運行庫函數如strtok()時就會先取得_tiddata塊的地址再將需要保護的數據存入_tiddata塊中。這樣每個線程就只會訪問和修改自己的數據而不會去篡改其它線程的數據了。因此,如果在代碼中有使用標準C運行庫中的函數時,儘量使用_beginthreadex()來代替CreateThread()。
第二段代碼:_beginthreadex()
#include <iostream>
#include<Windows.h>
#include <process.h>
unsigned int __stdcall ThreadFun(PVOID pm)
{
std::cout<<GetCurrentThreadId()<<"說:"<<*((int*)pm)<<std::endl;
return 0;
}
int main()
{
const int n =5;
int x[n]={0,9,8,7,6};
unsigned int a[n];
HANDLE handle[n];
for(int i=0;i<n;i++)
handle[i] =(HANDLE)_beginthreadex(NULL,0,ThreadFun,&x[i],0,&a[i]);
WaitForMultipleObjects(n,handle,true,INFINITE);
for(int j=0;j<n;j++)
std::cout<<a[j]<<std::endl;
system("pause");
return 0;
}
運行結果:
這張圖好不容易截到;充分說明進程調用過程的不確定性