我来讲解一下“C++11线程、互斥量以及条件变量示例详解”这个话题的完整攻略。
什么是C++11线程、互斥量以及条件变量?
C++11是C++语言的标准之一,其中包含了多线程编程的支持。C++11中提供了std::thread类来创建和管理线程,同时还定义了std::mutex和std::condition_variable来支持线程之间的同步和互斥。
当多个线程同时访问同一资源时,会出现资源竞争的情况。为了避免资源竞争,需要使用互斥量来控制对资源的访问。条件变量则用于协调线程之间的时间顺序和防止不必要的等待。
示例1:使用互斥量实现线程之间的同步和互斥
下面是示例代码:
#include <iostream>
#include <thread>
#include <mutex>
using namespace std;
mutex mtx; // 全局互斥量
void print(char ch){
mtx.lock();
for (int i = 0; i < 5; ++i){
cout << ch;
this_thread::sleep_for(chrono::milliseconds(100));
}
cout << endl;
mtx.unlock();
}
int main(){
cout << "Start..." << endl;
thread t1(print, 'A');
thread t2(print, 'B');
t1.join();
t2.join();
cout << "End..." << endl;
return 0;
}
上面的程序创建了两个线程t1和t2,其中t1和t2都调用了print函数来输出指定的字符。
整个程序的执行过程如下:
- 程序开始执行,输出“Start...”
- t1和t2线程分别开始执行,t1输出5个‘A’,t2输出5个‘B’
- 程序等待t1和t2线程执行完成
- 程序输出“End...”
注意,为了同步访问共享资源cout,我们使用了mtx互斥量来控制对共享资源的访问。
示例2:使用条件变量实现线程之间的协作和防止不必要的等待
下面是示例代码:
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
using namespace std;
mutex mtx; // 全局互斥量
condition_variable cv; // 全局条件变量
bool ready = false; // 全局标记位
void print(char ch){
unique_lock<mutex> lock(mtx); // 所有操作前需要先获取锁
while (!ready){ // 等待条件成立
cv.wait(lock);
}
for (int i = 0; i < 5; ++i){
cout << ch;
this_thread::sleep_for(chrono::milliseconds(100));
}
cout << endl;
ready = false;
cv.notify_one(); // 通知一个正在等待的线程
}
int main(){
cout << "Start..." << endl;
thread t1(print, 'A');
thread t2(print, 'B');
this_thread::sleep_for(chrono::milliseconds(500));
ready = true; // 设置条件成立
cv.notify_one(); // 通知一个正在等待的线程
t1.join();
t2.join();
cout << "End..." << endl;
return 0;
}
上面的程序创建了两个线程t1和t2,其中t1和t2都调用了print函数来输出指定的字符。
整个程序的执行过程如下:
- 程序开始执行,输出“Start...”
- 两个线程t1和t2同时等待条件ready成立
- 主线程等待500ms后设置标记位ready=true,同时通知一个正在等待的线程
- t1和t2线程中只有一个线程(根据系统调度情况)被唤醒,输出5个指定字符
- 重复第2-4步,直到t1和t2线程全部执行完成
- 程序输出“End...”
注意,在示例2中,我们使用了condition_variable来协调线程之间的时间顺序和防止不必要的等待。在等待条件ready时,线程会进入等待状态,并释放已经获取的锁,直到条件ready成立时再重新获取锁并继续执行。在设置ready=true时,我们需要通知一个正在等待的线程,确保等待的线程可以继续执行。
以上就是关于“C++11线程、互斥量以及条件变量”的完整攻略,希望可以帮助到您。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++11线程、互斥量以及条件变量示例详解 - Python技术站