Redis双链表实现安全队列

场景: task + bak 双链表完成安全队列

Task列表                             bak列表

 
 
 
 
 
 

 

 

业务逻辑:

1:Rpoplpush task bak

2:接收返回值,并做业务处理

3:如果成功,rpop bak 清除任务. 如不成功,下次从bak表里取任务


https://blog.csdn.net/qq_25551295/article/details/47708469

安全队列

04-23

m_hSemaphore是否多余了?rnrn感觉多余,举例说明,2个线程使用这个类, rn一个类进行添加append数据,一个getnext数据.rnrn只需要用关键段保护 队列就可以了。 没必要用信号量啊。rnrn为什要用恩?rnrnrn[code=c]rnrntemplaternclass CSafeDequernrnpublic:rn CSafeDeque(void)rn rn m_hSemaphore = CreateSemaphore(NULL, 0, 0x7FFFFFFF, NULL);rn InitializeCriticalSection(&m_csData);rn rnrn virtual ~CSafeDeque(void)rn rn CloseHandle(m_hSemaphore);rn DeleteCriticalSection(&m_csData);rn rnrn // 获取队列大小rn DWORD GetSize()rn rn DWORD dwSize;rnrn EnterCriticalSection(&m_csData);rn dwSize = m_lstData.size();rn LeaveCriticalSection(&m_csData);rnrn return dwSize;rn rnrn // 判断队列是否为空rn BOOL IsEmpty()rn rn BOOL bResult;rnrn EnterCriticalSection(&m_csData);rn bResult = m_lstData.empty();rn LeaveCriticalSection(&m_csData);rnrn return bResult;rn rnrn // 为队列添加元素rn void Append(T& t)rn rn EnterCriticalSection(&m_csData);rn m_lstData.push_back(t);rn LeaveCriticalSection(&m_csData);rnrn ReleaseSemaphore(m_hSemaphore, 1, NULL);rn rnrn // 获取下一项元素,并指定等待的时间(单位毫秒)rn BOOL GetNext(T& t, DWORD dwMilliseconds)rn rn if (WaitForSingleObject(m_hSemaphore, dwMilliseconds) == WAIT_OBJECT_0)rn rn EnterCriticalSection(&m_csData);rn t = m_lstData.front();rn m_lstData.pop_front();rn LeaveCriticalSection(&m_csData);rnrn return TRUE;rn rnrn return FALSE;rn rnrnprivate:rn HANDLE m_hSemaphore;rnrn list m_lstData; // 队列rn CRITICAL_SECTION m_csData; // 队列保护临界区rn;rnrn[/code]

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试