读书人

采用事件内核对象实现线程同步的有关问

发布时间: 2012-04-11 17:42:33 作者: rapoo

采用事件内核对象实现线程同步的问题
/*在Initializ中完成对数组的输入初始化后,通知PrintFun线程,
打印出字符数组。但是程序结果不是我想要的,大家帮我看看
*/

#include <stdio.h>
#include <string.h>
#include <process.h>
#include <windows.h>
#define MAX_INDEX 5


HANDLE hEvent;
char array[MAX_INDEX] = "ABCD ";
void PrintFun(void);
void Initializ(void);

int main(void)
{
HANDLE hpr;
HANDLE hinit;

hEvent = CreateEvent(NULL, FALSE, TRUE, NULL);
hinit = (void*)_beginthread((void*)Initializ, 0, NULL);
hpr = (void*)_beginthread((void*)PrintFun, 0, NULL);
WaitForSingleObject(hinit,INFINITE);
WaitForSingleObject(hpr,INFINITE);
return 0;

}
void Initializ(void)
{
int i = 0;
char ch = '\0 ';
WaitForSingleObject(hEvent, INFINITE);
while (i < MAX_INDEX && ch != 'q ') {
ch = getchar();
array[i] = ch;
i++;
}
SetEvent(hEvent);
}

void PrintFun(void)
{
int i = 0;
WaitForSingleObject(hEvent,INFINITE);
while(i < MAX_INDEX) {
printf( "%c ",array[i]);
i++;
}
printf( "\n ");
}


/*在Initializ中完成对数组的输入初始化后,通知PrintFun线程,
打印出字符数组。但是程序结果不是我想要的,大家帮我看看
*/



[解决办法]
Initializ和PrintFun在开始的时候都等待hEvent对象,这个时候谁将获取hEvent对象是不确定的,如果PrintFun先获取了,就会出现lz不希望的结果。
[解决办法]
#include <stdio.h>
#include <string.h>
#include <process.h>
#include <windows.h>
#define MAX_INDEX 5


HANDLE hEvent;

char Array[MAX_INDEX] = "ABCD ";
void PrintFun(void*);
void Initializ(void*);

int main(void)
{
HANDLE hpr;
HANDLE hinit;

//hEvent = CreateEvent(NULL, FALSE, TRUE, NULL); ===> 改为:
hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

hinit = (HANDLE)_beginthread(Initializ, 0, NULL);
hpr = (HANDLE)_beginthread(PrintFun, 0, NULL);
WaitForSingleObject(hinit,INFINITE);
WaitForSingleObject(hpr,INFINITE);

system( "pause ");
return 0;

}

void Initializ(void* )
{
int i = 0;
char ch = '\0 ';
//WaitForSingleObject(hEvent, INFINITE); 去掉这一行!!!!!
while (i < MAX_INDEX && ch != 'q ') {
ch = getchar();
Array[i] = ch;
i++;
}
SetEvent(hEvent);
}

void PrintFun(void*)
{
int i = 0;
WaitForSingleObject(hEvent,INFINITE);
while(i < MAX_INDEX) {
printf( "%c ",Array[i]);
i++;
}
printf( "\n ");
}

读书人网 >C语言

热点推荐