zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    codeforces C. Cows and Sequence 解题报告
    codeforces A. Point on Spiral 解题报告
    codeforces C. New Year Ratings Change 解题报告
    codeforces A. Fox and Box Accumulation 解题报告
    codeforces B. Multitasking 解题报告
    git命令使用
    shell简单使用
    知识束缚
    php 调用系统命令
    数据传输方式(前端与后台 ,后台与后台)
  • 原文地址:https://www.cnblogs.com/doutu/p/4848555.html
Copyright © 2011-2022 走看看