• 使用std::mutex取代QMutex


      为了保证对某个资源的操作是原子性的(对资源读写时,只有当前的操作结束,才允许另外线程对其操作,这里有个理解误区,资源操作原子性不是说,当前某个线程获得了某个资源使用权,然后线程执行时间完毕,要切换线程了,因为资源操作是原子性的,所以它就阻止线程切换,这是不可能的,要是某个程序里获得资源不放,那么操作系统上其他程序都不能跑咯。当然不是,原子操作的意思是,某个线程获得了某个资源的使用权,其他资源也想获得该资源的使用权时只能等待--等待会导致线程切换(节约CPU时间),只有当获得资源使用权的线程释放了资源使用权,则其他线程就可以操作)

      代码是在多线程运行中是可以重入的。

      下面分别给出QMutex和std::mutex的写法,都非常简单,写出来留个记录。

     1 #include <thread>
     2 #include <iostream>
     3 #include <chrono>
     4 #include <QMutex>
     5 #include <QMutexLocker>
     6 
     7 using namespace std;
     8 
     9 QMutex mutex;
    10 
    11 void ThreadFunc(void)
    12 {
    13     QMutexLocker locker(&mutex);
    14     cout<<"Enter Func "<<std::this_thread::get_id()<<endl;
    15 
    16     std::this_thread::sleep_for(std::chrono::milliseconds(1000));
    17 
    18     cout<<"Exit Func "<<std::this_thread::get_id()<<endl;
    19 }
    20 
    21 int main(int argc, char *argv[])
    22 {
    23     thread t1(ThreadFunc);
    24     thread t2(ThreadFunc);
    25     thread t3(ThreadFunc);
    26 
    27     t1.join();
    28     t2.join();
    29     t3.join();
    30     std::this_thread::sleep_for(std::chrono::milliseconds(5000));
    31 
    32     cout<<"Main Thread Exit"<<endl;
    33 
    34     return 0;
    35 }
    View Code

     1 #include <thread>
     2 #include <iostream>
     3 #include <chrono>
     4 #include <mutex>
     5 
     6 using namespace std;
     7 
     8 mutex tmutex;
     9 
    10 void ThreadFunc(void)
    11 {
    12     std::lock_guard<std::mutex> locker(tmutex);
    13     cout<<"Enter Func "<<std::this_thread::get_id()<<endl;
    14 
    15     std::this_thread::sleep_for(std::chrono::milliseconds(1000));
    16 
    17     cout<<"Exit Func "<<std::this_thread::get_id()<<endl;
    18 }
    19 
    20 int main(int argc, char *argv[])
    21 {
    22     thread t1(ThreadFunc);
    23     thread t2(ThreadFunc);
    24     thread t3(ThreadFunc);
    25 
    26     t1.join();
    27     t2.join();
    28     t3.join();
    29     std::this_thread::sleep_for(std::chrono::milliseconds(5000));
    30 
    31     cout<<"Main Thread Exit"<<endl;
    32 
    33     return 0;
    34 }
    View Code

  • 相关阅读:
    C++ SDL2事件处理
    C++ SDL_Image配置
    C++ TinyXML库读写XML
    C++ libcurl库使用
    C++ 配置使用libcurl
    C++ 正则使用
    C++使用cJSON
    Vue通过状态为页面切换添加loading、为ajax加载添加loading
    移动端真机调试工具--DebugGap (VIDE)
    new Date(str)返回的时间结果在移动端比PC端快了8小时
  • 原文地址:https://www.cnblogs.com/kanite/p/8421617.html
Copyright © 2020-2023  润新知