多线程编程(1)

来源:互联网 发布:软件培训计划 编辑:程序博客网 时间:2024/05/21 17:50

一  创建线程

函数:

    

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;elsebreak;ReleaseMutex(hmutex);}return 0;}DWORD WINAPI Fun2Proc(LPVOID lpParameter){while(1){        WaitForSingleObject(hmutex,INFINITE);if(ticks > 0 )cout<<"thread2 sell ticke"<<ticks--<<endl;elsebreak;ReleaseMutex(hmutex);}return 0;}