0 线程相关操作
std::this_thread::yield();//让该线程休息一下,让出资源
std::this_thread::sleep_for(std::chrono::seconds(1)); //每隔1秒进行一次
1 全局锁
//测试全局锁
std::mutex globalmutex;
void myprint1(int n,char c){
std::lock_guard<std::mutex> lock(globalmutex);
for(int i = 0;i < n;i++){
std::cout<<c;
}
std::cout<<std::endl;
}
void test1(){
std::thread t1(myprint1,50,'#');
std::thread t2(myprint1,50,'*');
t1.join();
t2.join();
}
#和*的打印不会乱套,按正常顺序进行。
2 局部锁
//测试局部锁
void myprint2(int n,char c){
std::mutex localmutex;
std::lock_guard<std::mutex> lock(localmutex);
for(int i = 0;i < n;i++){
std::cout<<c;
}
std::cout<<std::endl;
}
void test2(){
std::thread t1(myprint2,50,'#');
std::thread t2(myprint2,50,'*');
//局部锁状态下其实没有效果,#*会乱序打印
//锁的意义在于,当一个mutex被锁住的时候,其他线程要想锁这个mutex时会被卡住
//等待解锁之后才可以继续加锁,加锁成功则该线程继续向下进行,其他线程则进行等待
t1.join();
t2.join();
}
#*的打印会乱序
//锁的意义在于,当一个mutex被锁住的时候,其他线程要想锁这个mutex时会被卡住
//等待解锁之后才可以继续加锁,加锁成功则该线程继续向下进行,其他线程则进行等待
3 加锁和解锁不是同一个线程
//一个线程加锁,另一个线程来解锁
std::mutex mutex3;
int panduan = 1;
void myprint3(int n,char c){
if(panduan){
mutex3.lock();
panduan = 0;
}else{
mutex3.unlock();
panduan = 1;
}
for(int i = 0;i < n;i++){
std::cout<<c;
}
std::cout<<std::endl;
}
//下面会乱序
void test3(){
std::thread t1(myprint3,50,'#');
std::thread t2(myprint3,50,'*');
std::thread t3(myprint3,50,'$');
std::thread t4(myprint3,50,'@');
t1.join();
t2.join();
t3.join();
t4.join();
}
以上还是会乱序
4 全部代码
#include <iostream>
#include <mutex>
#include <thread>
//测试全局锁
std::mutex globalmutex;
void myprint1(int n,char c){
std::lock_guard<std::mutex> lock(globalmutex);
for(int i = 0;i < n;i++){
std::cout<<c;
}
std::cout<<std::endl;
}
void test1(){
std::thread t1(myprint1,50,'#');
std::thread t2(myprint1,50,'*');
t1.join();
t2.join();
}
//测试局部锁
void myprint2(int n,char c){
std::mutex localmutex;
std::lock_guard<std::mutex> lock(localmutex);
for(int i = 0;i < n;i++){
std::cout<<c;
}
std::cout<<std::endl;
}
void test2(){
std::thread t1(myprint2,50,'#');
std::thread t2(myprint2,50,'*');
//局部锁状态下其实没有效果,#*会乱序打印
//锁的意义在于,当一个mutex被锁住的时候,其他线程要想锁这个mutex时会被卡住
//等待解锁之后才可以继续加锁,加锁成功则该线程继续向下进行,其他线程则进行等待
t1.join();
t2.join();
}
//一个线程加锁,另一个线程来解锁
std::mutex mutex3;
int panduan = 1;
void myprint3(int n,char c){
if(panduan){
mutex3.lock();
panduan = 0;
}else{
mutex3.unlock();
panduan = 1;
}
for(int i = 0;i < n;i++){
std::cout<<c;
}
std::cout<<std::endl;
}
//下面会乱序
void test3(){
std::thread t1(myprint3,50,'#');
std::thread t2(myprint3,50,'*');
std::thread t3(myprint3,50,'$');
std::thread t4(myprint3,50,'@');
t1.join();
t2.join();
t3.join();
t4.join();
}
int main(){
// test1();
// test2();
test3();
return 0;
}