您的位置:首页 > 其它

利用单事件对象进行线程同步

2013-04-01 16:52 375 查看
按书上的代码调不出来,无错,但是空白。

于是,我只好加了一个WaitSingleObject,

结果,只能显示截断的字符,于是调协好 Character Set,才一切OK。

线程间同步,进程间通信,内存分配。这差不多算是系统编程的三大重点了。

涉及了内存,CPU。



/* ************************************
*《精通Windows API》
* 示例代码
* Event.c
* 7.2.1  演示使用Event同步线程
**************************************/

/* 头文件 */
#include <windows.h>
#include <stdio.h>
/* 常量定义 */
#define NUMTHREADS    3
#define BUFFER_SIZE    16
#define FOR_TIMES    5
/* 全局变量 */
HANDLE hEvent;
HANDLE hThread; // 用于同步
BYTE lpSharedBuffer[16] = {0};    // 共享内存
/* 函数声明 */
void UseEvents(void);
DWORD WINAPI EventFunction(LPVOID lpParam);

/*************************************
* int main(void)
* 功能    演示
*
* 参数    未使用
**************************************/
int main()
{

UseEvents();
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);

}

/*************************************
* void UseEvents(void)
* 功能    演示Event的使用方法
*
* 参数    未使用
**************************************/
void UseEvents(void)
{
//HANDLE hThread;

hEvent = CreateEvent(
NULL,            // 默认安全属性
TRUE,            // 手工重置
FALSE,            // 初始为未置位的
NULL            // 未命名
);
// 判断是否创建成功
if (hEvent == NULL)
{
printf("CreateEvent failed (%d)\n", GetLastError());
return;
}
// 创建线程
hThread = CreateThread(NULL, 0,
EventFunction,
NULL,
0, NULL);
if (hThread == NULL)
{
printf("CreateThread failed (%d)\n", GetLastError());
return;
}
Sleep(200); // 可以做一些其他处理
// 向共享内存中复制数据
CopyMemory(lpSharedBuffer,"Event",lstrlen("Event"));
// 设置 Event 使ThreadFunction线程可以开始复制数据
SetEvent(hEvent);
}

/*************************************
* DWORD WINAPI EventFunction(LPVOID lpParam)
* 功能    线程函数,读共享内存
*
* 参数    未使用
**************************************/
DWORD WINAPI EventFunction(LPVOID lpParam)
{
DWORD dwWaitResult;
// 等待,直到事件被置位
dwWaitResult = WaitForSingleObject(
hEvent,            // Event 句柄
INFINITE);        // 无限等待
if (dwWaitResult != WAIT_OBJECT_0)
{
printf("Wait error: %d\n", GetLastError());
return 0;
}
// 读共享内存
printf(lpSharedBuffer);
printf("\nlpSharedBuffer");
// 重置事件
if (! ResetEvent(hEvent) )
{
printf("SetEvent failed (%d)\n", GetLastError());
return 0;
}
return 1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: