博客
关于我
Linux信号量编程实例
阅读量:792 次
发布时间:2023-02-03

本文共 2616 字,大约阅读时间需要 8 分钟。

Linux信号量实现可控队列示例

本例展示了Linux信号量的基本用法,通过两个线程分别对一个公用队列进行入队和出队操作,利用信号量进行控制。当队列为空时,出队操作可以被阻塞;当队列满时,入队操作可以被阻塞。

常用的信号量函数包括:

  • sem_init:初始化信号量sem_t,可以指定初始值和是否共享。
  • sem_wait:一直阻塞等待直到信号量值大于0。
  • sem_timedwait:阻塞等待若干时间直到信号量值大于0。
  • sem_post:使信号量加1。
  • sem_destroy:释放信号量,与sem_init对应。

以下是实现可控队列的代码示例:

#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

说明:

  • 两个线程分别模拟入队和出队操作。
  • put_thread线程将30个元素依次入队,每入队5个元素后会阻塞。
  • get_thread线程每隔1000毫秒从队列取一个元素。
  • 队列最大容量为5,入队和出队操作都可以被信号量控制。

转载地址:http://mvzfk.baihongyu.com/

你可能感兴趣的文章
Linux下的多用户管理和认证:从入门到精通(附实例)
查看>>
Linux下的容器化技术:从入门到实践
查看>>
Linux下的文件权限与访问控制:守护你的数据宝藏
查看>>
Linux下的版本控制系统——Git:初学者指南
查看>>
Linux下的硬件管理与设备驱动全解析
查看>>
Linux下的系统安全加固与入侵检测全解析
查看>>
Linux下的系统监控与性能调优:从入门到精通
查看>>
Linux下的自动化任务与计划任务:让你的系统更智能
查看>>
linux下监控用户操作记录的工具
查看>>
Linux下磁盘的分区
查看>>
linux下解压命令
查看>>
Linux下设置Tomcat启动参数
查看>>
linux下迅雷远程下载服务,在 Linux 下使用迅雷的另一种无入侵方式
查看>>
Linux下运行Jmeter压测
查看>>
Linux下进程通信与FIFO操作详解
查看>>
Linux下通过ssh访问另一台内网服务器
查看>>
Linux下通过端口杀死进程
查看>>
Linux下部署maven-web项目,包括JDK安装、TOMCAT安装、MYSQL安装详细解释
查看>>
linux下配置Java环境变量
查看>>
Linux下配置无密码登录
查看>>