0
点赞
收藏
分享

微信扫一扫

【C++】做一个飞机空战小游戏(九)——发射子弹的编程技巧

江南北 2023-08-19 阅读 15
c++

目录

1--std::unique_lock的使用

1-1--std::adopt_lock参数

1-2--std::try_to_lock参数

1-3--std::defer_lock参数

1-4--互斥量所有权转移


1--std::unique_lock的使用

std::unique_lock<std::mutex> guard1(my_mutex1)
std::mutex *ptr = guard1.release();
...
// 需手动解锁
ptr->unlock();

1-1--std::adopt_lock参数

// example
my_mutex1.lock();

// my_mutex1 手动进行lock()以后,在使用std::unique_lock应添加std::adopt_lock参数
std::unique_lock<std::mutex> guard1(my_mutex1, std::adopt_lock);

1-2--std::try_to_lock参数

#include <iostream>
#include <thread>
#include <list>
#include <mutex>
 
class myClass{
public:
    // 收集数据到消息队列
    void inMsgRecvQueue(){
        for(int i = 0; i < 100; i++){
            std::unique_lock<std::mutex> guard1(my_mutex1, std::try_to_lock);
            if(guard1.owns_lock()){ // 获取锁,执行临界区
                std::cout << "Running inMsgRecvQueue(), insert one value: " 
                    << i << std::endl; 
                msgRecvqueue.push_back(i); // 消息队列存储消息
            }
            else{ // 无法获取锁,执行其他工作
                std::cout << "Running inMsgRecvQueue(), do other works" << std::endl;
            }
        }
    }
    // 从消息队列取数据
    void outMsgRecvQueue(){
        for(int i = 0; i < 100; i++){
            if(!msgRecvqueue.empty()){
                // 获取锁后休息10s
                std::unique_lock<std::mutex> guard1(my_mutex1);
                std::chrono::microseconds dura(20000); // 10000ms
                std::this_thread::sleep_for(dura);
                // 取出数据
                int command = msgRecvqueue.front();
                msgRecvqueue.pop_front(); 
            }
            else{
                std::cout << "Running outMsgRecvQueue(), " 
                    "the msgRecvqueue is empty" << std::endl;
            }
        }
    }
private:
    std::list<int> msgRecvqueue; // 消息队列
    std::mutex my_mutex1; // 创建互斥量 
};
 
int main(int argc, char *argv[]){
    myClass sample1;
    std::thread myInMsgObj(&myClass::inMsgRecvQueue, &sample1); // 收集数据线程
    std::thread myOutMsgObj(&myClass::outMsgRecvQueue, &sample1); // 取出数据线程
    myInMsgObj.join();
    myOutMsgObj.join();
 
    return 0;
}

1-3--std::defer_lock参数

1-4--互斥量所有权转移

std::unique_lock<std::mutex> guard1(my_mutex1);

std::std::unique_lock<std::mutex> guard2(std::move(guard1));
举报

相关推荐

0 条评论