執行緒同步機制-包裝類

yqp@發表於2020-11-09

為了充分複用程式碼,將執行緒同步機制分裝成3個類。

#ifndef LOCK_H
#define LOCK_H

#include
#include<pthread.h>
#include<semaphore.h>

class sem
{
public:
/建立並初始化訊號量/
sem()
{
if(sem_init(&m_sem, 0, 0) != 0)
{
/建構函式沒有返回值,可以通過丟擲異常來進行報錯誤/
throw std::exception();
}
}
/銷燬訊號量/
~sem()
{
sem_destroy(&m_sem);
}
/等待訊號量/
bool wait()
{
return sem_wait(&m_sem) == 0;
}

    /*增加訊號量*/
    bool post()
    {
        return sem_post(&m_sem) == 0;
    }
private:
    sem_t m_sem;

};

class locker
{
public:
locker()
{
if(pthread_mutex_init(&m_mutex, NULL) != 0)
{
throw std::exception();
}
}

    ~locker()
    {
        pthread_mutex_destroy(&m_mutex);
    }
    
    bool lock()
    {
        return pthread_mutex_lock(&m_mutex) == 0;
    }

    bool unlock()
    {
        return pthread_mutex_unlock(&m_mutex) == 0;
    }
private:
    pthread_mutex_t m_mutex;

};

class cond
{
public:
cond()
{

    if(pthread_mutex_init(&m_mutex, NULL) != 0)
    {
        throw std::exception();
    }

    if(pthread_cond_init(&m_cond, NULL) != 0)
    {
        pthread_mutex_destroy(&m_mutex);
        throw std::exception();
    }
}

~cond()
{
    pthread_mutex_destroy(&m_mutex);
    pthread_cond_destroy(&m_cond);
}

bool wait()
{
    int ret = 0;
    pthread_mutex_lock(&m_mutex);

    ret = pthread_cond_wait(&m_cond, &m_mutex);

    pthread_mutex_unlock(&m_mutex);

    return ret ==0;
}
//喚醒等待條件變數的執行緒
bool signal()
{
    return pthread_cond_signal(&m_cond) == 0;
}

private:
pthread_mutex_t m_mutex;
pthread_cond_t m_cond;

};

#endif

相關文章