多线程编程(1)

一  创建线程

函数:

    

HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
  DWORD dwStackSize,                        // initial stack size
  LPTHREAD_START_ROUTINE lpStartAddress,    // thread function
  LPVOID lpParameter,                       // thread argument
  DWORD dwCreationFlags,                    // creation option
  LPDWORD lpThreadId                        // thread identifier
);
参数:
 lpThreadAttributes  一般为NULL NULL使用默认安全性,不可以被子线程继承,否则需要定义一个结构体将它的bInheritHandle成员初始化为TRUE
dwstacksize       设置初始栈的大小,以字节为单位,如果为0,那么默认将使用与调用该函数的线程相同的栈空间的大小
lpstartaddress      线程函数的指针
lpparameter         给线程函数发送的参数指针,可谓结构体指针,对象指针
lpthreadid            用于保存新线程的id
返回值:
返回创建线程的句柄 HANDLE 类型
线程函数写法:
DWORD WINAPI ThreadProc(
  LPVOID lpParameter   // thread data
);
在线程创建完成后 许调用closehandle()函数 关闭句柄
二  创建临界对象
函数1: 
HANDLE CreateMutex(
  LPSECURITY_ATTRIBUTES lpMutexAttributes,  // SD
  BOOL bInitialOwner,                       // initial owner
  LPCTSTR lpName                            // object name
);
参数:
lpmutexattributes  线程的安全性,如果是NULL 则线程不能被继承
bInitialOwner      创建该线程的线程是否拥有该互斥对象
lpName             互斥对象的名字
返回值:
返回互斥对象的句柄 handle
函数2:
DWORD WaitForSingleObject(
  HANDLE hHandle,        // handle to object
  DWORD dwMilliseconds   // time-out interval
);
参数:
hHandle 用createmutex创建的临界区对象的句柄
dwMilliseconds   定时时间间隔,单位为milliseconds(毫秒).如果指定一个非零值,函数处于等待状态直到hHandle标记的对象被触发,或者时间到了。如果dwMilliseconds为0,对象没有被触发信号,函数不会进入一个等待状态,它总是立即返回。如果dwMilliseconds为INFINITE,对象被触发信号后,函数才会返回。
调用后 需要调用
BOOL ReleaseMutex(
  HANDLE hMutex   // handle to mutex
);函数 释放句柄
互斥对象 拥有一个使用数量 和 一个线程id ,和一个计数器
在一个线程中调用waitforsingleobject  在另一个线程中releasemutex 释放的互斥对象 不是同一个,因为互斥对象的线程id表示那个想成调用的互斥对象
在使用互斥对象时 如果调用两次waitforsingleobject 需调用两次releasemutex 才可以,否子计数器为2,release一次 计数器为1,互斥对象仍为无信号状态
#include<windows.h>
#include<iostream>
using namespace std;


DWORD WINAPI Fun1Proc(LPVOID lpParameter);
DWORD WINAPI Fun2Proc(LPVOID lpParameter); 




int ticks = 100;
HANDLE  hmutex;
void main()
{
	HANDLE handle1;
	HANDLE handle2;
	handle1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
	handle2 = CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
	CloseHandle(handle1);
	CloseHandle(handle2);
	hmutex = CreateMutex(NULL,false,TEXT("tickets"));
	if(hmutex)
	{
		if( ERROR_ALREADY_EXISTS == GetLastError())
		{
			cout<<"only one running"<<endl;
		    return ;
		}
	}

	Sleep(1000);


}

DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
	while(1)
	{
		WaitForSingleObject(hmutex,INFINITE);
		if(ticks > 0 )
			cout<<"thread1 sell ticke"<<ticks--<<endl;
		else
			break;
		ReleaseMutex(hmutex);

	}
	return 0;
}

DWORD WINAPI Fun2Proc(LPVOID lpParameter)
{
	while(1)
	{
        WaitForSingleObject(hmutex,INFINITE);
		if(ticks > 0 )
			cout<<"thread2 sell ticke"<<ticks--<<endl;
		else
			break;
		ReleaseMutex(hmutex);
	}
	return 0;
}















 
 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值