栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

198

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

198

执行:
g++ -std=c++11 -pthread -Wl,--no-as-needed queue.cpp

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;


template //模板。使得容器中的元素不限于int类型
class LockfreeList
{
private:
 std::list list;

private:
 volatile int mutex;
 int lock;
 int unlock;

public:
 LockfreeList() :mutex(0), lock(0), unlock(1)
 {

 }
 ~LockfreeList()
 {

 }

 
 void Lock()
 {
     while (!__sync_bool_compare_and_swap(&mutex, lock, 1))
     {
         usleep(1);
     }
 }

 void Unlock()
 {
     //上锁后,mutex地址所指空间中 的值变成1,这里就不需要在循环判断了
     __sync_bool_compare_and_swap(&mutex, unlock, 0);
 }

 void Push(T data)
 {
     //在一切用到比较交换的技术-》CAS策略的函数中,mutex地址所指空间中的值是动态变化的
     Lock();
     list.push_back(data);
     Unlock();
 }

 T Front()
 {
     Lock();
     T data = list.front();
     Unlock();

     return data;
 }

 void PopFront()
 {
     Lock();
     list.pop_front();
     Unlock();
 }

 bool IsEmpty()
 {
     Lock();
     if (list.empty())
     {
         Unlock();
         return true;
     }
     else
     {
         Unlock();
         return false;
     }
 }

 bool Find(T data)
 {
     typename std::list::iterator it;

     Lock();
     for (it = list.begin(); it != list.end(); ++it)
     {
         if (*it == data)
         {
             Unlock();
             return true;
         }
     }

     Unlock();
     return false;
 }
};

LockfreeList LF;

thread_local int num = 1;
//生产者
void Producer()
{
    while(true)
    {
        num++;
        cout<<"num push:"< 
CAS策略的一些小小问题: 

其实在CAS中,还有一种异常产生,也就是常说的ABA的现象。所谓ABA现象就是当前现象期望值是A,某个线程将A改为B,另外线程将B改为A,导致当前线程误以为还是原来的值,然后操作就会导致一些异常出现。
例如,偶尔会发生:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/663974.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号