文章目錄
- 一、CreateThread()和 WaitForSignalObject()的用法
- 二、線程互斥處理【轉載】
一、CreateThread()和 WaitForSignalObject()的用法
#include "windows.h"#include "stdio.h"void Scan(char* str){printf("%s",str);Sleep(4000);}void main(){char* s="NBA YAO YEAR!\n";HANDLE hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Scan,s,0,NULL);WaitForSingleObject(hThread, INFINITE);return ;}/*參數說明: HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes,//必須為NULL ,線程的安全性DWORD dwStackSize, //一般為0 ,表示堆棧與外部大小相同 ,線程的深度LPTHREAD_START_ROUTINE lpStartAddress, //線程函數名稱 LPVOID lpParameter, //傳遞給線程函數的參數,如果為多個,自訂結構體 DWORD dwCreationFlags,//0表示建立線程後立即啟動線程,如果不是立即啟動需要調用ResumeThread函數 LPDWORD lpThreadId); //用來標記該線程的名稱 DWORD WaitForSingleObject( HANDLE hHandle, // handle to object to wait for DWORD dwMilliseconds // time-out interval in milliseconds); //等待hThread線程結束,INFINITE無時間限制*/
二、線程互斥處理【轉載】
#include <windows.h> #include <iostream.h> DWORD WINAPI Fun1Proc(LPVOID lpParameter);//thread data DWORD WINAPI Fun2Proc(LPVOID lpParameter);//thread data int index=0; int tickets=10; HANDLE hMutex; void main() { HANDLE hThread1; HANDLE hThread2; //建立線程 hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL); CloseHandle(hThread1); CloseHandle(hThread2);
//建立互斥對象
hMutex=CreateMutex(NULL,TRUE,"tickets"); if (hMutex) { if (ERROR_ALREADY_EXISTS==GetLastError())//得到錯誤:已經存在
{ // 如果已有互斥量存在則釋放控制代碼並複位互斥量 CloseHandle(m_hMutex); m_hMutex = NULL; cout<<"only one instance can run!"<<endl; return; } } WaitForSingleObject(hMutex,INFINITE); ReleaseMutex(hMutex); Sleep(4000);//讓主線程睡4秒,讓其他線程有時間執行完他們的代碼,如果不睡就會出現其他線程執行不完或出錯的情況,但時如果不知道線程需要多少時間執行,那應該寫多少時間? } //線程1的入口函數 DWORD WINAPI Fun1Proc(LPVOID lpParameter)//thread data { while (true)//無限迴圈線程 { WaitForSingleObject(hMutex,INFINITE);//得到互斥體才能執行 if (tickets>0) { Sleep(1); cout<<"thread1 sell ticket :"<<tickets--<<endl; } else break; ReleaseMutex(hMutex);//釋放互斥體 } return 0; } //線程2的入口函數 DWORD WINAPI Fun2Proc(LPVOID lpParameter)//thread data { while (true) { WaitForSingleObject(hMutex,INFINITE); if (tickets>0) { Sleep(1); cout<<"thread2 sell ticket :"<<tickets--<<endl; } else break; ReleaseMutex(hMutex); } return 0; } //詳解 HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes, // 指向安全屬性的指標 BOOL bInitialOwner, // 初始化互斥對象的所有者 LPCTSTR lpName // 指向互斥對象名的指標 ); 參數 lpMutexAttributes 指向一個SECURITY_ATTRIBUTES結構的指標,這個結構決定互斥體控制代碼是否被子進程繼承。 bInitialOwner 布爾類型,決定互斥體的建立者是否為擁有者 lpName 指向互斥體名字字串的指標。互斥體可以有名字。 互斥體的好處是可以在進程間共用