本文共 2616 字,大约阅读时间需要 8 分钟。
Linux信号量实现可控队列示例
本例展示了Linux信号量的基本用法,通过两个线程分别对一个公用队列进行入队和出队操作,利用信号量进行控制。当队列为空时,出队操作可以被阻塞;当队列满时,入队操作可以被阻塞。
常用的信号量函数包括:
以下是实现可控队列的代码示例:
#ifndef MSGDEQUEUE_H#define MSGDEQUEUE_H#include "tmutex.h"#include#include #include #include #include using namespace std;template class CMessageDequeue {public: CMessageDequeue(size_t MaxSize) : m_MaxSize(MaxSize) { sem_init(&m_enques, 0, m_MaxSize); sem_init(&m_deques, 0, 0); } ~CMessageDequeue() { sem_destroy(&m_enques); sem_destroy(&m_deques); } int sem_wait_i(sem_t *psem, int mswait) { if (mswait == -1) { return 0; } while (((rv = sem_wait(psem)) != 0) && (errno == EINTR)) { //屏蔽中断 } return rv; } bool push_back(const T& item, int mswait) { if (mswait == -1) { return false; } if (sem_wait_i(&m_enques, mswait) != 0) { //入队信号量被阻塞 return false; } // 定界加锁 AUTO_GUARD(g, MUTEX_TYPE, m_lock); try { m_data.push_back(item); cout << "push " << item << endl; sem_post(&m_deques); return true; } catch (...) { return false; } } bool pop_front(T& item, bool bpop, int mswait) { if (mswait == -1) { return false; } if (sem_wait_i(&m_deques, mswait) != 0) { return false; } // 定界加锁 AUTO_GUARD(g, MUTEX_TYPE, m_lock); try { item = m_data.front(); if (bpop) { m_data.pop_front(); cout << "pop " << item << endl; } sem_post(&m_enques); return true; } catch (...) { return false; } }private: MUTEX_TYPE m_lock; deque m_data; size_t m_MaxSize; sem_t m_enques; sem_t m_deques;};
测试代码如下:
#include "msgdequeue.h"#include#include #include using namespace std;void* get_thread(void* arg) { thread* t = (thread*)arg; while(true) { sleep(1000); // 每隔1秒取一次 int a = -1; if (qq.pop_front(a, true, 1000)) { cout << "pop failed. size=" << qq.size() << endl; } }}void* put_thread(void* arg) { int i = 0; while(i <= 30) { i++; if (qq.push_back(i, -1) == false) { cout << "无法入队" << endl; } } return NULL;}int main() { CMessageDequeue qq(5); // 定义一个最大容量为5的队列 pthread_t pget, pput; pthread_create(&pget, NULL, get_thread, NULL); pthread_create(&pput, NULL, put_thread, NULL); pthread_join(pget, NULL); pthread_join(pput, NULL); return 0;}
编译命令:
g++ msgdequeue.h test.cpp -lpthread -lrt -o test
运行程序:
./test
说明:
转载地址:http://mvzfk.baihongyu.com/