线程同步
虽然多线程的使用可以提高应用程序的性能,但也增加了复杂性。如果使用线程在同一时间执行几个函数,访问共享资源时必须相应地同步。
Boost.Thread提供多个的互斥类。
boost::mutex是最简单的一个,它的使用就像linux下的二进制互斥量。互斥的基本原则是当一个特定的线程拥有资源的时候防止其他线程夺取其所有权,一旦释放,其他的线程可以取得所有权。这将导致线程等待至另一个线程完成处理一些操作,从而相应地释放互斥对象的所有权。
下面的示例使用一个类型为 boost::mutex 的simple_mutex全局互斥对象。thread()函数获取此对象的所有权才在 for 循环内使用 lock()方法写入到标准输出流的。一旦信息被写入,使用unlock()方法释放所有权。
testSimpleMutex() 创建两个线程,同时执行thread ()函数。利用 for 循环,每个线程数到5,用一个迭代器写一条消息到标准输出流。然而,标准输出流是一个全局性的被所有线程共享的对象,该标准不提供任何保证 std::cout 可以安全地从多个线程访问。 因此,访问标准输出流必须同步:在任何时候,只有一个线程可以访问 std::cout。
由于两个线程试图在写入标准输出流前获得互斥体,实际上只能保证一次只有一个线程访问 std::cout。不管哪个线程成功调用 lock() 方法,其他所有线程必须等待,直到 unlock() 被调用。
mutex例子:
#include <boost/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <iostream>
boost::mutex simple_mutex;
using namespace std;
void wait(int seconds)
{
boost::this_thread::sleep(boost::posix_time::seconds(seconds));
}
void simpleMutex()
{
for (int i = 0; i < 5; i++)
{
wait(1);
simple_mutex.lock();
cout << "Thread" << boost::this_thread::get_id() << " : " << i << endl;
simple_mutex.unlock();
}
}
void testSimpleMutex()
{
boost::thread t1(simpleMutex);
boost::thread t2(simpleMutex);
t1.join();
t2.join();
}
int main(int argc, char* argv[])
{
testSimpleMutex();
return 0;
}
boost::lock_guard,在其内部构造和析构函数分别自动调用lock() 和 unlock() 。 实现获取和释放互斥体的功能。
如下例:
void thread()
{
for (int i = 0; i < 5; ++i)
{
wait(1);
boost::lock_guard lock(simple_mutex);
std::cout << "Thread " << boost::this_thread::get_id() << ": " << i << std::endl;
}
}
boost::unique_lock,典型用法,boost::unique_lock lock(mutex, boost::try_to_lock);第二个参数传入一个 boost::try_to_lock 类型的值,对应的构造函数就会调用 try_lock方法。这个方法返回 bool 型的值:如果能够获得互斥体则返回true,否则返回 false。相比lock函数,try_lock会立即返回,而且在获得互斥体之前不会被阻塞。
如下例:
boost::timed_mutex time_mutex;
void uniqueLockThread()
{
for (int i = 0; i < 5; ++i)
{
wait(1);
boost::unique_lock<boost::timed_mutex> lock(time_mutex, boost::try_to_lock);
if (!lock.owns_lock())
{
lock.timed_lock(boost::get_system_time() + boost::posix_time::seconds(1));
}
time_mutex.unlock();
std::cout << "Thread " << boost::this_thread::get_id() << ": " << i << endl;
}
}
void testUniqueLockThread()
{
boost::thread t1(uniqueLockThread);
boost::thread t2(uniqueLockThread);
t1.join();
t2.join();
}
上面的程序向boost::unique_lock 的构造函数的第二个参数传入boost::try_to_lock。然后通过 owns_lock() 可以检查是否可获得互斥体。如果不能, owns_lock() 返回false。这也用到 boost::unique_lock 提供的另外一个函数: timed_lock() 等待一定的时间以获得互斥体。 给定的程序等待长达1秒,应较足够的时间来获取更多的互斥。
三个方法获取一个互斥体:
lock() 会一直等待,直到获得一个互斥体。
try_lock()则不会等待,但如果它只会在互斥体可用的时候才能获得,否则返回 false。
timed_lock()试图获得在一定的时间内获取互斥体。和try_lock()一样,返回bool 类型的值意味着成功是否。
boost::unique_lock 这个所谓的独占锁意味着一个互斥量同时只能被一个线程获取。其他线程必须等待,直到互斥体再次被释放。
非独占锁。 boost::shared_lock 的类提供了非独占锁,这个类必须和 boost::shared_mutex 型的互斥量一起使用。boost::shared_mutex它允许线程获取多个共享所有权和一个专享所有权,它比mutex的代价高很多。通过lock_shared()或try_lock_shared()获取共享所有权,使用unlock_shared()来释放共享所有权。
读锁定时shared_lock<shared_mutex>,写锁定时使用unique_lock<shared_mutex>。
如下例
#include <boost/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <iostream>
class rw_data
{
private:
int m_x;
boost::shared_mutex rw_mu;
public:
rw_data():m_x(0){}
void write()
{
boost::unique_lock<boost::shared_mutex> ul(rw_mu);
++m_x;
}
void read(int *x)
{
boost::shared_lock<boost::shared_mutex> sl(rw_mu);
*x = m_x;
}
};
void writer(rw_data &d)
{
for (int i = 0; i < 20; ++i)
{
boost::this_thread::sleep(boost::posix_time::seconds(10));
d.write();
cout << "writer:" << i << endl;
}
}
void reader(rw_data &d)
{
int x;
for (int i = 0; i < 10; ++i)
{
boost::this_thread::sleep(boost::posix_time::seconds(5));
d.read(&x);
cout << "reader:" << x << endl;
}
}
void testSharedMutex()
{
rw_data d;
boost::thread_group pool;
pool.create_thread(boost::bind(reader, boost::ref(d)));
pool.create_thread(boost::bind(reader, boost::ref(d)));
pool.create_thread(boost::bind(reader, boost::ref(d)));
pool.create_thread(boost::bind(reader, boost::ref(d)));
pool.create_thread(boost::bind(writer, boost::ref(d)));
pool.create_thread(boost::bind(writer, boost::ref(d)));
pool.join_all();
}
int main(int argc, char* argv[])
{
testSharedMutex();
return 0;
}
分享到:
相关推荐
### C++ Boost Thread 编程指南精要解析 #### 前言:多线程编程在C++中的挑战与机遇 随着互联网应用、事务服务器以及图形用户界面(GUI)应用程序等现代软件系统的复杂性增加,多线程编程已成为提高程序性能和响应...
#### 三、Boost Thread 库的功能特点 1. **线程管理**:Boost.Thread 提供了线程创建、销毁、同步等功能,支持线程池管理,有效减少了线程创建和销毁的开销。 2. **互斥锁与条件变量**:提供了多种类型的锁(如互斥...
**Boost库中文文档**对于中国开发者来说是一份非常宝贵的资源,它帮助开发者理解和使用Boost库的各种组件,降低学习曲线,提高开发效率。文档通常包含了详细的功能介绍、使用示例和API参考,使得开发者能够快速掌握...
C++ Boost Thread 编程指南.doc
三、Boost库的学习路径: 1. **基础理论**:首先了解C++的基础知识,包括类、模板、泛型编程等。 2. **选择主题**:根据实际需求或兴趣,选择Boost库中的特定主题进行深入学习,如线程、图形、智能指针等。 3. **...
1. **多线程支持**:Boost.Thread库提供了C++标准库中尚未包含的多线程编程接口,包括线程的创建、同步、线程局部存储等功能,有助于开发者编写高效的并发程序。 2. **智能指针**:Boost库中的smart_ptr系列(例如...
6. 线程管理:Boost.Thread库提供了C++标准库中没有的线程管理功能,如条件变量、线程池、异步调用等,使得在C++中编写多线程程序变得更加容易。 7. 日期时间处理:Boost.DateTime库提供了日期、时间和时间间隔的...
"C++BOOST中文帮助文档.zip"是一个压缩包,其中包含了一份Boost库的中文帮助文档,对于学习和使用Boost库的中文用户来说,这是一个非常宝贵的资源。 Boost库中的主要组件包括但不限于以下几个方面: 1. **智能指针...
最近开发中用到大量BOOST库的东西,现在把我开发中总结的boost使用方法分享一下,里面包括智能指针、boost定时器、boostthread和io_service等的用法和说明,还有一本Beyond the C++ Standard Library: An ...
**Boost库概述** Boost是一个开源的C++库集合,它为C++标准库提供了扩展,包含了大量的高效、高质量和跨平台的工具包...通过深入学习和合理应用Boost,开发者可以更好地利用C++的强大功能,解决实际项目中的各种挑战。
《C++11/14高级编程 Boost程序库探秘 中文版 第三版》是罗剑锋先生的力作,由清华大学出版社出版。这本书详细介绍了C++11和C++14标准的新特性和Boost程序库的深度应用,旨在帮助广大的C++程序员和爱好者提升技能,更...
在提供的“boost第三方C++库”中,我们可以看到压缩包文件名为“boost_1_54_0”,这个版本号表示Boost库的1.54.0版本。Boost库的版本迭代非常频繁,每个新版本都会引入新的功能或修复已知问题。1.54.0版本是一个相对...
1.47版本的《C++ Boost手册》是开发者学习和使用Boost库的重要资源,它详细解释了每个库的用法、示例和注意事项,是提升C++编程技能不可或缺的参考书目。通过深入理解和熟练运用Boost库,开发者可以写出更高效、更...
Pool内存池管理,Preprocessor预处理器宏工具,Program_options命令行选项解析,Python支持C++与Python的交互,Smart_ptr智能指针管理,Test单元测试框架,Thread多线程支持,Timer计时器,Tribool三态布尔值等。...
通过C++参考手册和Boost库中文版的学习,开发者可以深入理解C++的各个方面,从而编写出高效、可靠且易于维护的代码。这两个资源对于初学者和经验丰富的程序员都是宝贵的参考资料,能够提升编程技能和解决问题的能力...
C++ Boost Thread编程指南是关于如何在C++中利用Boost库进行多...最后,参考资料部分提供了更多深入学习Boost.Thread和其他相关技术的资源,帮助程序员更好地理解和利用这个强大的库来编写高效、可靠的多线程C++程序。
Boost.Thread库提供了多线程编程的支持,包括线程创建、同步机制(如互斥量、条件变量)和线程安全的容器。这使得开发者能够轻松地在C++中实现并发和并行程序。 3. **算法**: Boost库包含了丰富的算法库,如`...
综上所述,Boost C++ Libraries不仅是一组强大的工具集,也为C++开发者提供了广阔的学习和发展空间。通过学习和应用Boost库,开发者可以提高自己的编程技能,同时也能为项目带来更高的生产力和效率。随着未来C++标准...
首先看看boost::thread的构造函数吧,boost::thread有两个构造函数: (1)thread():构造一个表示当前执行线程的线程对象; (2)explicit thread(const boost::function0& threadfunc): boost::function0可以...