#include<Windows.h>
#include<stdio.h>
DWORD WINAPI myfunc1(LPVOID lpParam);
DWORD WINAPI myfunc2(LPVOID lpParam);
static int a1 = 0;
CRITICAL_SECTION Section;
int main()
{
InitializeCriticalSection(&Section);//应该在此创建
HANDLE h1, h2;
h1 = ::CreateThread(NULL, 0, myfunc1, NULL, 0, NULL);
printf("线程1开始运行\r\n");
h2 = ::CreateThread(NULL, 0, myfunc2, NULL, 0, NULL);
printf("线程2开始运行\r\n");
//不能再次创建 InitializeCriticalSection(&Section);//应该在此创建
::CloseHandle(h1);
::CloseHandle(h2);
::Sleep(1000);
printf("input q to quit\r\n");
while (1)
{
if (getchar() == 'q')
{
DeleteCriticalSection(&Section);
return 0;
}
}
}
DWORD WINAPI myfunc1(LPVOID lpParam)
{
while (1)
{
EnterCriticalSection(&Section);
a1++;
if (a1 < 10000)
{
::Sleep(1000);
printf("线程1正在计数:%d\r\n", a1);
LeaveCriticalSection(&Section);
}
else
{
LeaveCriticalSection(&Section);
break;
}
}
return 0;
}
DWORD WINAPI myfunc2(LPVOID lpParam)
{
while (1)
{
EnterCriticalSection(&Section);
a1++;
if (a1 < 10000)
{
::Sleep(100);
printf("线程2正在计数:%d\r\n", a1);
LeaveCriticalSection(&Section);
}
else
{
LeaveCriticalSection(&Section);
break;
}
}
return 0;
}
本文展示了一个使用Windows API进行线程同步的例子。通过两个线程对全局变量进行递增操作,并利用临界区(CRITICAL_SECTION)确保线程安全。主函数中创建了两个线程分别执行myfunc1和myfunc2函数,在这两个函数内部,线程会进入临界区,修改全局变量a1,然后输出当前值。
518

被折叠的 条评论
为什么被折叠?



