求一个互斥变量的思路

飞翔的薄荷 2012-08-29 09:00:30
互斥变量主要保护一个链表,(1)添加和删除时禁止其它任何操作,(2)读取链表时其它线程也可以读取链表,禁止删除和添加。

自己写了一个,但是添加和删除操作渴求而死。求一个更好的思路,能附上代码就更好了。


//MyLock.h



#pragma once

#include <list>

class CMyLock
{
public:
CMyLock();
virtual ~CMyLock();
enum LOCK_MODE
{
LOCK_MODE_NONE,
LOCK_MODE_ONLY_ONE, //独占模式
LOCK_MODE_MORE_USER, //分享模式
};
private:
struct LOCK_ITME
{
DWORD nThreadID;
LOCK_MODE nLockMode;
} ;
typedef std::list<LOCK_ITME> CListItem;
typedef std::list<LOCK_ITME>::iterator CPListItem;

private:
LOCK_MODE m_curMode;
CCriticalSection m_cs;
CListItem m_listItem;
CCriticalSection m_csList;
public:
BOOL Lock(LOCK_MODE const &nMode = LOCK_MODE_MORE_USER);
BOOL Unlock();
};



//MyLock.cpp


#include "MyLock.h"


CMyLock::CMyLock()
:m_curMode(LOCK_MODE_NONE)
{

}

CMyLock::~CMyLock()
{

}

BOOL CMyLock::Lock(LOCK_MODE const &lockMode)
{
//注意 锁和当前线程关联,解锁时只能是当前线程。
LOCK_ITME item = {0};
item.nThreadID = GetCurrentThreadId();
item.nLockMode = lockMode;

BOOL bWait = TRUE;

switch (lockMode)
{
case LOCK_MODE_ONLY_ONE:
bWait = TRUE;
break;
case LOCK_MODE_MORE_USER:
if (LOCK_MODE_MORE_USER == m_curMode)
{
bWait = FALSE;
}
else
{
bWait = TRUE;
}
break;
default:
ASSERT(0);
return FALSE;
break;
}

if (bWait)
{
m_cs.Lock();
}

m_csList.Lock();
m_curMode = lockMode;
m_listItem.push_back(item);
m_csList.Unlock();

return TRUE;
}

BOOL CMyLock::Unlock()
{
//只能释放当前线程的锁
DWORD const nThreadID = GetCurrentThreadId();
BOOL bFind = FALSE;
m_csList.Lock();
CPListItem it = m_listItem.begin();
for (;it != m_listItem.end(); ++it)
{
if (nThreadID == it->nThreadID)
{
m_listItem.erase(it);
bFind = TRUE;
break;
}
}
if (m_listItem.empty())
{
m_curMode = LOCK_MODE_NONE;
m_cs.Unlock();
}
m_csList.Unlock();
ASSERT(bFind);
return bFind;
}

...全文
134 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2012-08-29
  • 打赏
  • 举报
回复
临界区啊

// Request ownership of the critical section.
EnterCriticalSection(&CriticalSection);

// Access the shared resource.

// Release ownership of the critical section.
LeaveCriticalSection(&CriticalSection);
hdg3707 2012-08-29
  • 打赏
  • 举报
回复
我告诉我用环形队列的大概思路:
一个线程增加数据,其它线程读取数据.
增加数据时进行部分锁定,也就是当环形队列满时(数据溢出)时,头指针就往前移动溢出数据量的位置,这时先锁定,头指针移动完成后解锁.如果在增加数据时不涉及到移动头指针就不锁定,这时其它线程可以读取数据.
读数据时先锁定头指针,读完后再解锁,然后再处理数据,这样锁定时间短,不至于丢失数据太多(数据溢出太多)
假设你是用单向链表做,也可以按这个思路锁定和解锁.添加时不用锁定(不影响读数据),删除时一定要锁定.如果是多个线程读时要锁定(多个读线程共享一个头指针,如果多个读线程是独立读数据不用锁定)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧