//临界
class CCritSec
{
public:
CCritSec() {
InitializeCriticalSection(&m_CritSec);
};
~CCritSec() {
DeleteCriticalSection(&m_CritSec);
};
void Lock() {
EnterCriticalSection(&m_CritSec);
};
void Unlock() {
LeaveCriticalSection(&m_CritSec);
};
protected:
CRITICAL_SECTION m_CritSec;
};
//链表
struct LIST
{
bool data;
LIST* pNext;
};
//全局临界对象
CCritSec sc;
//队列的头
LIST* pListHead = NULL;
//队列的尾
LIST* pListTail = NULL;
//向队列中添加一个元素
DWORD WINAPI AddIntoListThread(LPVOID pParam)
{
//加锁防止在添加时被使用
sc.Lock();
LIST* pNew = (LIST*)pParam;
if(!pListHead)
{
pListTail = pListHead = pNew;
}
else
{
pListTail->pNext = pNew;
pListTail = pNew;
}
sc.Unlock();
return 1;
}
//这个线程只需启动一次
DWORD WINAPI TimeThread(LPVOID pParam)
{
while(1)
{
//定时器
Sleep(2000);
sc.Lock();
LIST* pCur = pListHead;
sc.Unlock();
LIST* pPre = NULL;
while(pCur!=NULL)
{
//前处理部分
if(data)
{
//判断成立时删除当前元素
LIST* pRemove = pCur;
sc.Lock();
if(pPre)
{
pPre->pNext = pCur->pNext;
pCur = pPre->pNext;
if(!pCur)
{
pListTail = pPre;
}
}
else
{
pCur = pCur->pNext;
pListHead = pCur;
}
sc.Unlock();
GlobalFree(pRemove);
pRemove = NULL;
}
else
{
//移动到下一个元素
sc.Lock();
pPre = pCur;
pCur = pCur->pNext;
sc.Unlock();
}
}
}
return 0;
}
定时器、队列的逻辑。
最新推荐文章于 2023-10-07 16:45:00 发布