首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2012-04-11 
采用事件内核对象实现线程同步的问题/*在Initializ中完成对数组的输入初始化后,通知PrintFun线程,打印出字

采用事件内核对象实现线程同步的问题
/*在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 ");
}

热点排行