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 }
posted @ 2011-11-15 19:07  rookieeeeee  阅读(301)  评论(0编辑  收藏  举报