Windows 下多线程编程

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



 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值