c++11 实现信号量
来源:互联网 发布:c 获取数据库实例名 编辑:程序博客网 时间:2024/06/05 04:23
简单来说,就是信号量太容易出错了(too error prone),通过组合互斥锁(mutex)和条件变量(condition variable)可以达到相同的效果,且更加安全。实现如下:
class Semaphore {public: Semaphore(long count = 0) : count_(count) { } void Signal() { boost::unique_lock<boost::mutex> lock(mutex_); ++count_; cv_.notify_one(); } void Wait() { boost::unique_lock<boost::mutex> lock(mutex_); cv_.wait(lock, [=] { return count_ > 0; }); --count_; }private: boost::mutex mutex_; boost::condition_variable cv_; long count_;};
下面创建三个工作线程(Worker),来测试这个信号量。
int main() { boost::thread_group threads; for (int i = 0; i < 3; ++i) { threads.create_thread(&Worker); } threads.join_all(); return 0;}
每个工作线程先等待信号量,然后输出线程 ID 和当前时间,输出操作以互斥锁同步以防止错位,睡眠一秒是为了模拟线程处理数据的耗时。
void Worker() { g_semaphore.Wait(); boost::thread::id thread_id = boost::this_thread::get_id(); std::string now = FormatTime(boost::posix_time::second_clock::local_time(), "%H:%M:%S"); { boost::lock_guard<boost::mutex> lock(g_io_mutex); std::cout << "Thread " << thread_id << ": wait succeeded" << " (" << now << ")" << std::endl; } // Sleep 1 second to simulate data processing. boost::this_thread::sleep(boost::posix_time::seconds(1)); g_semaphore.Signal();}
信号量本身是一个全局对象,count
为 1
,一次只允许一个线程访问:
Semaphore g_semaphore(1);
输出为:
Thread 1d38: wait succeeded (13:10:10)Thread 20f4: wait succeeded (13:10:11)Thread 2348: wait succeeded (13:10:12)
可见每个线程相隔一秒,即一次只允许一个线程访问。如果把 count
改为 3
:
Semaphore g_semaphore(3);
那么三个线程输出的时间应该一样:
Thread 19f8: wait succeeded (13:10:57)Thread 2030: wait succeeded (13:10:57)Thread 199c: wait succeeded (13:10:57)
最后附上 FormatTime
函数的实现:
std::string FormatTime(boost::posix_time::ptime& time, const char* format) { std::stringstream stream; boost::posix_time::time_facet* facet = new boost::posix_time::time_facet(); facet->format(format); stream.imbue(std::locale(std::locale::classic(), facet)); stream << time; return stream.str();}
阅读全文
0 0
- C语言信号量实现红绿灯
- c++11信号量实现
- c++11信号量实现
- c++11 实现信号量
- Linux C++Timer(用信号量实现)
- 生产者-消费者问题实现 (linux下C同步信号量和互斥信号量的应用)
- linux多线程编程(C):信号量实现的线程安全队列
- C语言信号量实现两线程循环打印
- c用信号量(Semaphore)实现消费者生产者同步
- c++11中信号量(semaphore)的实现
- 实现信号量(二) pipe实现信号量
- 实现信号量(三) 消息队列实现信号量
- 实现信号量(四) 条件变量实现信号量
- 捕获ctrl+c信号量
- linux c 信号量编程
- linux c 信号量编程
- linux c 信号量编程
- linux c 信号量编程
- Vue 中的 v-cloak 解读
- C++学习笔记(1)
- ios中跳转界面
- WebSocket中关于使用ProtoBuf传输数据介绍js部分
- 内部类
- c++11 实现信号量
- Android客户端5分钟集成支付宝支付
- Codeforces Round #425 A. Sasha and Sticks
- CMake 学习(一):使用链接第三方库
- JDBC编程学习笔记(一)——与MySQL的连接 ConnMySql.java
- Linux磁盘管理-df,du,disk
- POI操作Excel
- spring------特殊字符转义和方法入参检测工具类
- git和svn区别