VC 线程同步实例

来源:互联网 发布:网络兼职写小说 编辑:程序博客网 时间:2024/05/20 06:36

1.MFC为临界区提供有一个CCriticalSection类,使用该类进行线程同步处理是非常简单的,只需在线程函数中使用CCriticalSection类成员函数Lock()和UnLock()标定出被保护代码片段即可。使用CCriticalSection类实现同步代码如下:

//MFC临界区类对象

CCriticalSection g_clsCriticalSection;

//共享资源

char g_cArray[10];

UINT ThreadProc20(LPVOID pParam)

{

//进入临界区

g_clsCriticalSection.Lock();

//对共享资源进行写入操作

for(int i=0; i<10;i++)

{

 g_cArray[i] = 'a';

Sleep(1);

}

//离开临界区

g_clsCriticalSection.Unlock();

return 0;

}

 

UINT ThreadProc21(LPVOID pParam)

{

//进入临界区

g_clsCriticalSection.Lock();

//对共享资源进行写入操作

for(int i=0; i<10;i++)

{

g_cArray[10-i-1] = 'b';

Sleep(1);

}

//离开临界区

g_clsCriticalSection.Unlock();

return 0;

}

 

//创建线程调用

void CSample08View::OnCriticalSectionMFC()

{

//启动线程

AfxBeginThread(ThreadProc20,NULL);

AfxBeginThread(ThreadProc21,NULL);

//等待继续按完毕

Sleep(300);

//报告计算结果

CString sResult = CString(g_cArray);

AfxMessageBox(sResult);

}

 

2.使用事件内核对象来实现线程同步 CreateEvent

//事件句柄

HANDLE hEvent = NULL;

//共享资源

char g_cArray[10];

UINT ThreadProc20(LPVOID pParam)

{

//等待事件置位

WaitForSingleObject(hEvent,INFINITE);

//对共享资源进行写入操作

for(int i=0; i<10;i++)

{

g_cArray[i] = 'a';

Sleep(1);

}

//处理完成后即将事件对象置位

SetEvent(hEvent);

return 0;

}

 

 

0 0