关键技术: 创建两个事件 CreateEvent, 创建一个事件 CreateEvent 是无法解决问题的
01 | // 20171228_01.cpp : Defines the entry point for the console application. |
02 | // |
03 |
04 | #include "stdafx.h" |
05 | #include <stdio.h> |
06 | #include <windows.h> |
07 |
08 | CRITICAL_SECTION cs; |
09 | DWORD g_Number = 0; |
10 | int g_Max = 10; |
11 | HANDLE hMutex; |
12 | HANDLE hEvent_Create; |
13 | HANDLE hEvent_User; |
14 |
15 | DWORD WINAPI ThreadProc1( |
16 | LPVOID lpParameter // thread data |
17 | ) |
18 | { |
19 | //生产者 |
20 | for ( int i=0;i<g_Max;i++) |
21 | { |
22 | //EnterCriticalSection(&cs); |
23 | |
24 | WaitForSingleObject(hEvent_Create,INFINITE); |
25 | g_Number = 1; |
26 | DWORD id = GetCurrentThreadId(); |
27 | printf ( "生产者 %d 的数据 %d 放入缓冲区 \n" ,id, g_Number); |
28 | //SetEvent(hEvent); |
29 | //ResetEvent(hEvent); |
30 | SetEvent(hEvent_User); |
31 | Sleep(110); |
32 | //ReleaseMutex(hMutex); |
33 | //LeaveCriticalSection(&cs); |
34 | } |
35 |
36 |
37 | return 0; |
38 | } |
39 |
40 | DWORD WINAPI ThreadProc2( |
41 | LPVOID lpParameter // thread data |
42 | ) |
43 | { |
44 | //消费者 |
45 | for ( int i=0;i<g_Max;i++) |
46 | { |
47 | //EnterCriticalSection(&cs); |
48 | //WaitForSingleObject(hMutex,INFINITE); |
49 | WaitForSingleObject(hEvent_User,INFINITE); |
50 | g_Number = 0; |
51 | DWORD id = GetCurrentThreadId(); |
52 | printf ( "---------消费者 %d 的数据 %d 放入缓冲区 \n" ,id, g_Number); |
53 | SetEvent(hEvent_Create); |
54 | Sleep(100); |
55 | //LeaveCriticalSection(&cs); |
56 | //ReleaseMutex(hMutex); |
57 | } |
58 | |
59 | |
60 | return 0; |
61 | } |
62 |
63 |
64 | int main( int argc, char * argv[]) |
65 | { |
66 |
67 | //printf("he111\n"); |
68 | //测试生产者和消费者的问题 |
69 | |
70 | //EnterCriticalSection() |
71 |
72 | //InitializeCriticalSection(&cs); |
73 |
74 | //hMutex = CreateMutex(NULL,FALSE,"XYZ"); |
75 | //OpenMutex() |
76 | //OpenMutex() |
77 |
78 | |
79 | HANDLE hThread[2]; |
80 | hThread[0] = CreateThread(NULL,0,ThreadProc1,NULL,0,NULL); |
81 | hThread[1] = CreateThread(NULL,0,ThreadProc2,NULL,0,NULL); |
82 |
83 | hEvent_Create = CreateEvent(NULL,FALSE,TRUE,NULL); |
84 | hEvent_User = CreateEvent(NULL,FALSE,FALSE,NULL); |
85 |
86 | WaitForMultipleObjects(2,hThread,TRUE,INFINITE); |
87 |
88 |
89 | CloseHandle(hThread[0]); |
90 | CloseHandle(hThread[1]); |
91 |
92 |
93 |
94 | printf ( "main ..... end........\n" ); |
95 | |
96 | //DeleteCriticalSection(&cs); |
97 | return 0; |
98 | } |
0则评论给“简单进程同步的解决”