• boost信号量 boost::interprocess::interprocess_semaphore的用法


       使用方法首先给信号量初始化赋值,可以根据需要设定需要的值,之前在写项目的过程中用这个控制下载的线程个数。

    1 boost::interprocess::interprocess_semaphore m_semaphore(0);

        然后就是pv操作了,v操作就只有一个post(),post()一次,信号量加1.p操作有三个,看函数名字都很明显知道是什么意思,

     wait(),try_wait() ,timed_wait(const boost::posix_time::ptime&abs_time).

       这里需要注意的是第三个p操做,对boost也不太熟, 很明显是等待到某一时间点,m_semaphore.timed_wait(boost::posix_time::ptime(second_clock::universal_time()+boost::posix_time::seconds(1))),等待一秒;这个时间是取universal_time,一开始不知道,试了几次不行,后面灵机一动看了下源码,原来如此.

     1 inline bool interprocess_semaphore::timed_wait(const boost::posix_time::ptime &abs_time)
     2 {
     3    if(abs_time == boost::posix_time::pos_infin){
     4       this->wait();
     5       return true;
     6    }
     7    //Obtain current count and target time
     8    boost::posix_time::ptime now(microsec_clock::universal_time());
     9    if(now >= abs_time)
    10       return false;
    11 
    12    do{
    13       if(this->try_wait()){
    14          break;
    15       }
    16       now = microsec_clock::universal_time();
    17 
    18       if(now >= abs_time){
    19          return this->try_wait();
    20       }
    21       // relinquish current time slice
    22       detail::thread_yield();
    23    }while (true);
    24    return true;
    25 }

     下面举个栗子

     1 #include <boost/interprocess/sync/interprocess_semaphore.hpp>
     2 #include <boost/thread.hpp>
     3 #include <boost/bind.hpp>
     4 #include <boost/date_time/posix_time/posix_time.hpp> 
     5 #include <iostream>
     6 using namespace std;
     7 boost::interprocess::interprocess_semaphore m_semaphore(1);
     8 void test(int i)
     9 {
    10     while(true)
    11     {
    12         if(m_semaphore.try_wait())
    13         {
    14             printf("%d
    ",i);
    15             m_semaphore.post();
    16             
    17         }
    18         boost::this_thread::sleep(boost::posix_time::seconds(2));
    19 
    20     }
    21 }
    22 using namespace boost::posix_time;
    23 int main()
    24 {
    25     boost::thread thread1(boost::bind(&test,1));
    26     boost::thread thread2(boost::bind(&test,2));
    27     getchar();
    28 
    29 }
  • 相关阅读:
    EJB Timer Service is not available. Timers for application with id 95795415990861824 will not be deleted
    MySql数据基本操作sql语句
    python 将字符串转换成字典dict的各种方式总结
    Go语言笔记:struct结构遍历
    golang实现base64编解码
    map赋值前要先初始化:assignment to entry in nil map
    python中 .write 无法向文件写入内容
    python 守护进程
    go语言解析 map[string]interface{} 数据格式
    python虚拟环境--virtualenv
  • 原文地址:https://www.cnblogs.com/doutu/p/4848555.html
Copyright © 2020-2023  润新知