最近在学多线程,写了一点代码就出现问题了,调试了几天也不知道问题出在哪里,代码如下:#include "stdafx.h"
#include <windows.h>HANDLE Event;
HANDLE Thread[1];
DWORD ThreadID[1], ErrorCode;
int i,j;
BOOL IsEventOK;DWORD WINAPI Thread1Proc(LPVOID lpParameter);
DWORD WINAPI Thread2Proc(LPVOID lpParameter);int main(int argc, char* argv[])
{
Event = CreateEvent(NULL, TRUE, TRUE, NULL);
i=0;
j=0; Thread[0] = CreateThread(NULL, 0, Thread1Proc, NULL, 0, &ThreadID[0]);
Thread[1] = CreateThread(NULL, 0, Thread2Proc, NULL, 0, &ThreadID[1]); WaitForSingleObject(Thread[0], INFINITE);
WaitForSingleObject(Thread[1], INFINITE);
CloseHandle(Thread[0]);
CloseHandle(Thread[1]);
CloseHandle(Event); return 0;
}DWORD WINAPI Thread1Proc(LPVOID lpParameter)
{
while (i++<100)
{
WaitForSingleObject(Event, INFINITE);
IsEventOK = ResetEvent(Event);
printf("线程1在执行\r\n");
IsEventOK = SetEvent(Event);
if (!IsEventOK)
{
ErrorCode = GetLastError();
}
}
return 0;
}DWORD WINAPI Thread2Proc(LPVOID lpParameter)
{
while(j++<100)
{
WaitForSingleObject(Event, INFINITE);
IsEventOK = ResetEvent(Event);
printf("线程2在执行\r\n");
IsEventOK = SetEvent(Event);
if (!IsEventOK)
{
ErrorCode = GetLastError();
}
}
return 0;
}这段代码总是线程1先运行,运行后调用ResetEvent总是成功的,可是再执行SetEvent的时候就出错了,代码总是返回6
#include <windows.h>HANDLE Event;
HANDLE Thread[1];
DWORD ThreadID[1], ErrorCode;
int i,j;
BOOL IsEventOK;DWORD WINAPI Thread1Proc(LPVOID lpParameter);
DWORD WINAPI Thread2Proc(LPVOID lpParameter);int main(int argc, char* argv[])
{
Event = CreateEvent(NULL, TRUE, TRUE, NULL);
i=0;
j=0; Thread[0] = CreateThread(NULL, 0, Thread1Proc, NULL, 0, &ThreadID[0]);
Thread[1] = CreateThread(NULL, 0, Thread2Proc, NULL, 0, &ThreadID[1]); WaitForSingleObject(Thread[0], INFINITE);
WaitForSingleObject(Thread[1], INFINITE);
CloseHandle(Thread[0]);
CloseHandle(Thread[1]);
CloseHandle(Event); return 0;
}DWORD WINAPI Thread1Proc(LPVOID lpParameter)
{
while (i++<100)
{
WaitForSingleObject(Event, INFINITE);
IsEventOK = ResetEvent(Event);
printf("线程1在执行\r\n");
IsEventOK = SetEvent(Event);
if (!IsEventOK)
{
ErrorCode = GetLastError();
}
}
return 0;
}DWORD WINAPI Thread2Proc(LPVOID lpParameter)
{
while(j++<100)
{
WaitForSingleObject(Event, INFINITE);
IsEventOK = ResetEvent(Event);
printf("线程2在执行\r\n");
IsEventOK = SetEvent(Event);
if (!IsEventOK)
{
ErrorCode = GetLastError();
}
}
return 0;
}这段代码总是线程1先运行,运行后调用ResetEvent总是成功的,可是再执行SetEvent的时候就出错了,代码总是返回6
解决方案 »
- 关于进程同步的问题
- 听说过strncpy在静态线程函数中会出错?
- #undef WINVER \ #define WINVER 0x500,这句为什么要放在Afx.h的最前面
- 如何写内存?
- :为什么我的ActiveX控件不响应鼠标事件?
- 线程输出文字到窗口问题,急!!
- 紧急求助!怎样在Windows从小字体变成大字体时,对话框能够适应字体的变化?
- 图形保存
- MFC怎么查找当前目录以及子目录下的*_DS.TXT文件?
- WIN2000 FTP服务问题?大送分?救命?
- m_pConnection.CreateInstance(__uuidof(_Connection));失败的问题讨论
- 关于windows内部的数据结构
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>HANDLE Event1, Event2;
HANDLE Thread[2];
DWORD ThreadID[2], ErrorCode;
int i,j;
BOOL IsEventOK = TRUE;const int g_nRunCount = 20;DWORD WINAPI Thread1Proc(LPVOID lpParameter);
DWORD WINAPI Thread2Proc(LPVOID lpParameter);int main(int argc, char* argv[])
{
Event1 = CreateEvent(NULL, FALSE/*TRUE*/, TRUE, NULL);
Event2 = CreateEvent(NULL, FALSE/*TRUE*/, /*TRUE*/FALSE, NULL);
i=0;
j=0;
printf("begin run ----->/n");
// SetEvent(Event);
Thread[0] = CreateThread(NULL, 0, Thread1Proc, NULL, 0, /*null*/&ThreadID[0]);
Thread[1] = CreateThread(NULL, 0, Thread2Proc, NULL, 0, &ThreadID[1]);
WaitForSingleObject(Thread[0], INFINITE);
WaitForSingleObject(Thread[1], INFINITE); CloseHandle(Thread[0]);
CloseHandle(Thread[1]);
CloseHandle(Event1);
CloseHandle(Event2);
return 0;
}DWORD WINAPI Thread1Proc(LPVOID lpParameter)
{
while (i < g_nRunCount)
{
if (WaitForSingleObject(Event1, INFINITE) != WAIT_OBJECT_0)
continue;
;
//IsEventOK = ResetEvent(Event);
printf("线程1在执行, %d\r\n", i);
IsEventOK = SetEvent(Event2);
i ++;
if (!IsEventOK)
{
ErrorCode = GetLastError();
}
}
return 0;
}DWORD WINAPI Thread2Proc(LPVOID lpParameter)
{
while(j < g_nRunCount)
{
if(WaitForSingleObject(Event2, INFINITE) != WAIT_OBJECT_0)
continue; //IsEventOK = ResetEvent(Event);
printf("线程2在执行, %d\r\n", j);
j ++;
IsEventOK = SetEvent(Event1);
if (!IsEventOK)
{
ErrorCode = GetLastError();
}
}
return 0;
}
DWORD ThreadID[1], ErrorCode;
-->
HANDLE Thread[2];
DWORD ThreadID[2], ErrorCode;