- CreateThread函数与_beginthreadex 函数的联合使用:
- 为了多线程同步的需要,使每个线程必须具有唯一的状态,CreateThread还不能灵活使用,需要使用C/C++运行期库;
- CreateThread函数参数与_beginthreadex函数对应的,只是类型不同,需要强制转换。
- 每个线程都有自己的内核对象,包含了该线程的属性信息;
#include<windows.h>
#include<iostream>
#include<process.h>
using namespace std;
UINT __stdcall ThreadProcess(LPVOID lpParam);
int b = true;
int count1 = 0;
int count2 = 0;
int main()
{
UINT Ui;
HANDLE hThread[10];
for (int i = 0; i < 10; i++)
{
hThread[i] = (HANDLE)::_beginthreadex(NULL, 0, ThreadProcess, NULL, 0, &Ui);
}
Sleep(6000);
b = false;
::WaitForMultipleObjects(10, hThread, TRUE, INFINITE);
for (int i = 0; i < 10; i++)
{
::CloseHandle(hThread[i]);
}
cout << "Count1=" << count1 << endl;
cout << "Count2=" << count2 << endl;
return 0;
}
UINT __stdcall ThreadProcess(LPVOID lpParam)
{
while (b)
{
count1++;
count2++;
}
return 0;
}
Count1=114786278
Count2=51099437
请按任意键继续. . .
- 同步上述count1与count2不同:临界区对象,能很好保护共享数据,但不能由于进程间锁定资源,它不是内核对象。
- 使用临界区对象:是定义在数据段中的一个CRITICAL_SECTION结构,确保在同一时间只有一个线程访问该数据段中的数据。
- 把临界区数据定义在保护数据段中,void InitializeCriticalSection(LPCRITICAL_SECTION lp_cs);指向数据段中的CRITICAL_SECTION结构;
- 申请访问数据段数据,void EnterCriticalSection(LPCRITICAL_SECTION lp_cs);
- 数据段区使用完毕,返还;void LeaveCriticalSection(LPCRITICAL_SECTION lp_cs);
- 程序不再使用临界区数据时,删除;void DeleteCriticalSection(LPCRITICAL_SECTION lp_cs);
#include<windows.h>
#include<iostream>
#include<process.h>
using namespace std;
UINT __stdcall ThreadProcess(LPVOID lpParam);
int b = true;
int count1 = 0;
int count2 = 0;
CRITICAL_SECTION cs;
int main()
{
UINT Ui;
HANDLE hThread[10];
::InitializeCriticalSection(&cs);
for (int i = 0; i < 10; i++)
{
hThread[i] = (HANDLE)::_beginthreadex(NULL, 0, ThreadProcess, NULL, 0, &Ui);
}
Sleep(6000);
b = false;
::WaitForMultipleObjects(10, hThread, TRUE, INFINITE);
for (int i = 0; i < 10; i++)
{
::CloseHandle(hThread[i]);
}
::DeleteCriticalSection(&cs);
cout << "Count1=" << count1 << endl;
cout << "Count2=" << count2 << endl;
return 0;
}
UINT __stdcall ThreadProcess(LPVOID lpParam)
{
while (b)
{
::EnterCriticalSection(&cs);
count1++;
count2++;
::LeaveCriticalSection(&cs);
}
return 0;
}
Count1=19105856
Count2=19105856
请按任意键继续. . .