Muduo库

MutexLock

class MutexLock : boost::noncopyable
{
public:
    MutexLock():holder_(0){
        pthread_mutex_init(&mutex_,NULL);
    }

    ~MutexLock(){
        pthread_mutex_destroy(&mutex_);
    }
    bool isLockByThisThread(){
        return holder_ == pthread_self();
        //原本是holder_ == CurrentThread::tid();
    }
    void assertLocked(){
        assert(isLockByThisThread());
    }
    void lock(){
        pthread_mutex_lock(&mutex_);
        holder_ = pthread_self();
        //如果两行反了,当前线程还没拿上锁呢,isLockByThisThread就会返回错误的结果了
        // 原本是holder_ = CurrentThread::tid();
    }
    void unlock(){
        holder_ = 0;
        pthread_mutex_unlock(&mutex_);
        //同上
    }
    pthread_mutex_t* getPhreadMutex(){
        return &mutex_;
    }
private:
    pthread_mutex_t mutex_;
    pid_t holder_;
};
}


class MutexLockGuard : boost::noncopyable{
public:
    explicit MutexLockGuard(MutexLock& mutex):mutex_(mutex){
        mutex.lock();
    }
    ~MutexLockGuard(){
        mutex_.unlock();
    }
private:
    MutexLock mutex_;
};

 

  有报错

   条件变量

class Condition :boost::noncopyable
{
public:
    explicit Condition(MutexLock& mutex):mutex_(mutex) {
        pthread_cond_init(&pcond_,NULL);
    }
    ~Condition(){
        pthread_cond_destroy(&pcond_);
    }
    void wait(){
        pthread_cond_wait(&pcond_,mutex_.getPthreadMutex());
    }
    void notify(){
        pthread_cond_signal(&pcond_);
    }
    void notifyall(){
        pthread_cond_broadcast(&pcond_);
    }

private:
    MutexLock& mutex_;
    pthread_cond_t pcond_;
};

  线程安全的读写操作

class Foo
{
public:
    Foo();
    ~Foo();
private:
    int value;
};

typedef std::vector<Foo> Foolist;
using FooListPtr = std::shared_ptr<Foolist>;

std::mutex mutex_;

FooListPtr  g_foos;

//遍历
void travels(){
    FooListPtr foos;
    {
        std::lock_guard<std::mutex> lockguard(mutex_);
        foos = g_foos;
        assert(!g_foos.unique());
    }
    for(auto it = foos->begin();it!= foos->end()){
        it.doit();
    }
}

void post(const Foo& f){
    std::lock_guard<std::mutex> lockguard(mutex_);
    if(!g_foos.unique()){
        //如果不止一个人正在使用g_foos,那么将g_foos重置
        g_foos.reset(new Foolist(*g_foos));
        //Replaces the managed object with an object pointed to by ptr.
        //保证在写的时候g_foos只有当前线程在调用
    }
    assert(g_foos.unique());
    g_foos->push_back(f);
}

  

posted on 2022-08-31 00:26  对我不好  阅读(8)  评论(0编辑  收藏  举报

导航