线程只有一个内核对象和有个栈,几乎不涉及记录活动,所以不占用内存。
注意:线程函数必须以这种形式定义:
DWORD WINAPI ThreadProc( LPVOID lpParam )
伪句柄:
GetCurrentProcess()
GetCurrentThread()
返回内核对象的伪句柄,不是真正的句柄,不会影响进程内核对象的使用计数。不需要closeHandle。
将伪句柄转换成真正的句柄
DuplicateHandle()
example:
duplicateHandle(
getCurrentProcess(),
GetCurrentThread(),
getCurrentProcess(),
&thread,
0,
FALSE,
DUPLICATE_SAME_ACCESS)
线程挂起:
1、在创建线程时,使用create_suspend
2、调用SuspendThread(thandle)
线程恢复:
rusumeThread()
用户模式下的线程同步
1、原子访问
LONG InterLockedExchangeAdd(&x,+/-1/2);不会切换到等待状态,浪费资源
2、关键段(可切换到等待状态)
3、Slim读写锁
SRWLOCK srwlock;
InitialSRWLock(&srwlock);//初始化
AcquireSRWLockExclusive(&srwlock)//排它锁
ReleaseSRWLockExclusive(&srwlock)
AcquireSRWLockShared(&srwlock)//共享锁
ReleaseSRWLockShared(&srwlock)
slim读写锁和关键段差不多,但是性能比关键段好
4、条件变量(前三种用来互斥,保护临界区,这种是用来同步的)
1、
CONDICTION_VARIABLE VAR;
CRITICAL_SECTION cs;
SleepCondictionVariableCS(
var,//变量
cs,//关键段
INFINITE//等待时间
0/condiction_variable_lockmode_shared//0:以独占形式访问。
)
SleepCondictionVariableSRW(
var,//变量
srw,//slim读写锁
INFINITE//等待时间
0/condiction_variable_lockmode_shared//0:以独占形式访问。
)
WakeCondictionVariable(&cs)
内核对象进行同步
1、事件内核对象
事件的用途是:让一个线程执行初始化工作,人然后再触发另一个线程,让他执行剩余的工作。当第一个线程完成时,会触发事件,另一个线程一直在等待该事件,它发现事件被触发,于是变成可调度状态。
CreateEvent
注意:如果为自动触发状态,那么被触发后,事件会自动设置为非触发状态(具体见核心编程5版P239)
设置事件为触发状态:
Setevent(Hevent)
设置事件为非触发状态:
Resetevent(Hevent)
关闭事件
CloseHandle(Hevent)
为了实现线程间的同步,不应该用人工重置的事件对象(因为人工不会改变事件状态,所以2个线程或者以上都可以不受阻碍地进入同一段保护区),应该使用自动重置事件对象。当执行完毕后应该用setEvebt将其设置为有信号状态。
2、信号量内核对象(用来同步)
1、createSemaphore
2、WaitForSingleObiect
通过调用等待函数,并传如信号量的句柄,如果大于1,则减1并继续运行。
3、releaseSemaphore增加信号量
3、互斥内核对象
CreateMutex
具体同上,用WaitForSingleObiect等待函数,并传如信号量的句柄,如果为0为触发状态,releaseMutex来减少计数
6437

被折叠的 条评论
为什么被折叠?



