WIN API 多线程编程(http://www.oschina.net/code/snippet_12_4980 开源中国社区)
001 |
// 线程实现2.cpp : 定义控制台应用程序的入口点。 |
002 |
// |
003 |
#include "stdafx.h" |
004 |
|
005 |
using namespace std; |
006 |
|
007 |
|
008 |
DWORD WINAPI Fun1Proc( LPVOID lpParameter); //thread data |
009 |
DWORD WINAPI Fun2Proc( LPVOID lpParameter); //thread data |
010 |
|
011 |
|
012 |
int index=0; |
013 |
int tickets=10; |
014 |
HANDLE hMutex; |
015 |
|
016 |
|
017 |
int _tmain( int argc, _TCHAR* argv[]) |
018 |
{ |
019 |
|
020 |
HANDLE hThread1; |
021 |
HANDLE hThread2; |
022 |
//创建线程 |
023 |
|
024 |
/* |
025 |
|
026 |
HANDLE CreateThread( |
027 |
LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to security attributes |
028 |
DWORD dwStackSize, // initial thread stack size |
029 |
LPTHREAD_START_ROUTINE lpStartAddress, // pointer to thread function |
030 |
LPVOID lpParameter, // argument for new thread |
031 |
DWORD dwCreationFlags, // creation flags |
032 |
LPDWORD lpThreadId // pointer to receive thread ID |
033 |
); |
034 |
|
035 |
第一个参数是指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中,它被设为NULL |
036 |
|
037 |
第二个参数是用于新线程的初始堆栈大小,默认值为0, 表示1MB。在任何情况下,Windows根据需要动态延长堆栈的大小。 |
038 |
|
039 |
第三个参数是指向线程函数的指标。函数名称没有限制,但是必须以下列形式声明:DWORD WINAPI ThreadProc (PVOID pParam) ; 返回值为DWORD,调用约定是WINAPI |
040 |
|
041 |
调用约定: |
042 |
|
043 |
除了c pascal stdcall之外,什么时候又来一个WINAPI调用约定(calling conversion)呢?哦WINAPI在WINDEF.h中被定义为:#define WINAPI __stdcall |
044 |
|
045 |
第四个参数为传递给ThreadProc的参数。这样主线程和从属线程就可以共享数据。 |
046 |
|
047 |
第五个参数通常为0,但当建立的线程不马上执行时为旗标CREATE_SUSPENDED。线程将暂停直到呼叫ResumeThread来恢复线程的执行为止。默认情况是立即执行 |
048 |
|
049 |
第六个参数:新线程ID会被传回这里 |
050 |
|
051 |
*/ |
052 |
|
053 |
|
054 |
|
055 |
hThread1=CreateThread( |
056 |
|
057 |
NULL, //1 |
058 |
|
059 |
0, //2 |
060 |
|
061 |
Fun1Proc, //3 |
062 |
|
063 |
NULL, //4 |
064 |
|
065 |
0, //5 |
066 |
|
067 |
NULL); //6 |
068 |
|
069 |
hThread2=CreateThread( |
070 |
|
071 |
NULL, |
072 |
|
073 |
0, |
074 |
|
075 |
Fun2Proc, |
076 |
|
077 |
NULL, |
078 |
|
079 |
0, |
080 |
|
081 |
NULL); |
082 |
|
083 |
CloseHandle(hThread1); |
084 |
|
085 |
CloseHandle(hThread2); |
086 |
|
087 |
|
088 |
|
089 |
//创建互斥对象 |
090 |
|
091 |
hMutex=CreateMutex(NULL,TRUE,_T( "tickets" )); |
092 |
|
093 |
if (hMutex) |
094 |
{ |
095 |
|
096 |
if (ERROR_ALREADY_EXISTS==GetLastError()) |
097 |
|
098 |
{ |
099 |
|
100 |
cout<< "only one instance can run!" << pre= "" > |
101 |
|
102 |
return 0; |
103 |
|
104 |
} |
105 |
|
106 |
} |
107 |
|
108 |
WaitForSingleObject(hMutex,INFINITE); |
109 |
ReleaseMutex(hMutex); |
110 |
Sleep(4000); |
111 |
system ( "pause" ); |
112 |
return 0; |
113 |
} |
114 |
DWORD WINAPI Fun1Proc( LPVOID lpParameter) //thread data |
115 |
|
116 |
{ |
117 |
while ( true ) |
118 |
{ |
119 |
ReleaseMutex(hMutex); |
120 |
WaitForSingleObject(hMutex,INFINITE); |
121 |
|
122 |
if (tickets>0) |
123 |
{ |
124 |
Sleep(1); |
125 |
|
126 |
cout<< "thread1 sell ticket :" <<< pre= "" > |
127 |
} |
128 |
else |
129 |
break ; |
130 |
ReleaseMutex(hMutex); |
131 |
|
132 |
} |
133 |
return 0; |
134 |
|
135 |
} |
136 |
//线程2的入口函数 |
137 |
|
138 |
DWORD WINAPI Fun2Proc( LPVOID lpParameter) //thread data |
139 |
|
140 |
{ |
141 |
|
142 |
while ( true ) |
143 |
|
144 |
{ |
145 |
|
146 |
ReleaseMutex(hMutex); |
147 |
|
148 |
WaitForSingleObject(hMutex,INFINITE); |
149 |
|
150 |
if (tickets>0) |
151 |
|
152 |
{ |
153 |
Sleep(1); |
154 |
cout<< "thread2 sell ticket :" <<< pre= "" > |
155 |
} |
156 |
|
157 |
else |
158 |
|
159 |
break ; |
160 |
|
161 |
ReleaseMutex(hMutex); |
162 |
|
163 |
} |
164 |
|
165 |
return 0; |
166 |
|
167 |
} |