#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 指向互斥体名字字符串的指针。互斥体可以有名字。 互斥体的好处是可以在进程间共享