信号量定义和运用:每一时刻只允许单线程访问
情形一:
class A
{
public:
A();
~A();
public:
ini();
Unini();
func();
MainFunc();
CSemaphore g_semaphore;//定义信号量
}
A::A()//构造函数先初始化信号量
{
g_semaphore(0,2);//初始化不允许线程访问
}
A::Unini()//卸载函数,释放信号量
{
ReleaseSemaphore(m_waitBluthSemaphore.m_hObject, 1, NULL);//释放一个线程资源
}
A::ini()//初始化函数,释放信号量
{
ReleaseSemaphore(m_waitBluthSemaphore.m_hObject, 1, NULL);//释放一个线程资源
}
A::func()
{
if (NULL == m_hWaitHandle)
{//线程创建
m_hWaitHandle = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)&ThreadFunc,this, 0, NULL);
}
......
}
int ThreadFunc()//线程函数
{
DWord dwWaitSingle = WaitForSingleObject(pCls->m_waitBluthSemaphore.m_hObject, 6*1000);//等待信号量释放,超时6秒
if (NULL !=pA->m_hWaitHandle)
{//执行完之后关闭该线程,释放信号量
CloseHandle(pA->m_hWaitHandle);
pA->m_hWaitHandle = NULL;
}
}
A::MainFunc()//主调函数
{
ini();
func();
Unini();
......
}
通过调用ini(),释放一个信号量,允许一个线程访问,func中开启一个线程占用资源,一个线程完成之后,才允许下次启动另外一个线程访问,每次只允许一个线程函数访问。最后通过调用Unini释放信号量。
情形二:
CSemaphore g_Websemaphore(1,2);//全局信号量,初始化信号量为1
{
public:
B();
~B();
public:
func();
B::func()
{
DWORD dwWaitSingle = WaitForSingleObject(g_Websemaphore.m_hObject, TIME_OUT);
//等待上次线程结束,TIME_OUT设置超时?
if (dwWaitSingle == WAIT_FAILED)
{
return ;//失败
}
if (dwWaitSingle == WAIT_TIMEOUT)
{
return ;//超时
}
......
ReleaseSemaphore(g_Websemaphore.m_hObject, 1, NULL);//处理完了就释放信号量
}
调用func,需要通过信号量来判断是否可以继续执行,这样保证了该函数同一时刻只执行一次(相当于主线程的同步问题)
阅读(2523) | 评论(0) | 转发(1) |