多线程编程(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;}
- 多线程编程(1)
- 多线程编程(1)
- UNIX多线程编程(1) 创建多线程
- Windows多线程编程(1)
- Delphi 多线程编程(1)
- Linus多线程编程(1)
- Linux 多线程编程(1)
- python多线程编程(1)
- C11 多线程编程(1)
- .NET多线程编程(1):多任务和多线程
- .NET多线程编程(1):多任务和多线程
- NET多线程编程(1):多任务和多线程
- .NET多线程编程(1):多任务和多线程
- .NET多线程编程(1):多任务和多线程
- .NET多线程编程(1):多任务和多线程
- .NET多线程编程(1):多任务和多线程
- .NET多线程编程(1):多任务和多线程
- .NET多线程编程(1):多任务和多线程
- LINUX和windows下如何判断CPU和系统是32位还是64位
- 用NDKr9编译最新ffmpeg2.0.1到android平台
- qt‘s Undo Framework
- hadoop2.x配置 - hadoop备份系数dfs.replication
- Unity3d对XML操作前期知识点_XML 命名空间(XML Namespaces)
- 多线程编程(1)
- hdu 2955 Robberies 01背包问题
- xp__显示桌面
- 《编程之美》电话号码对应字母组合问题
- C++对应c# 数据类型
- Android UI开发第三十四篇——SlidingPaneLayout
- Linux c 目录操作函数scandir
- 10g 自定义功能为WM_CONCAT的函数,返回CLOB
- c/c++:内存泄露和野指针的概念