zoukankan      html  css  js  c++  java
  • CPP 学习笔记-多线程

    知识点1

    转载自 https://www.ev0l.art/index.php/archives/9/

    - Linux 下编译 带<thread> 的CPP需要加上 -pthread 编译选项。例如:

    g++ -std=c++11 -pthread a.cpp
    

    - QT Creator 编译带<thread>的CPP有BUG,暂时不知道怎么去除!

    代码1

    #include <stdlib.h>v
    #include <thread>
    
    using namespace std;
    void run(char* p)
    {
        int i=0;
        i=system(p);
    }
    
    int main()
    {
        char p[5][20]={
            "ls",
            "echo nihao",
            "gnome-terminal",
            "terminator",
            "ps -aux"
    
        };
    
        while("nimei")
        {
           static  int i(0);
            if(i<5){
                thread  *pt=new  thread(run,p[i]);
                i+=1;
                cout<<"I now is :	"<<i<<endl;
            }
            else{
                break;
            }
    
            cout<<"Breaking...."<<endl;
        }
    
    
    
    
        cin.get();
        return 0;
    }
     

    知识点2

    <li> 关于thread类的内部成

    关键字详细解释
    id Thread的id
    native_handle_type native_handle_type
    operator= Move massive Thread
    get_id get Thread ID
    joinable get if joinable
    join join thread
    detach detach thread
    swap swap thread
    native_handle get native handle
    hardware_concurrency[static] Detect hardware concurrency (public static function)

    1.jpeg

    <li> 线程 detach 脱离主线程的绑定,主线程挂了,子线程不报错,子线程执行完自动退出。

    <li> 线程 detach以后,子线程会成为孤儿线程,线程之间将无法通信。

    知识点3

    <li>线程中变量的竞争控制是通过 mutex automic 来实现的

    <li>mutex : 互斥量。需要包含头文件 <mutex> 来使用 -->速度慢

    <li>atomic 原子变量。需要包含头文件<atomic>来实现 -->速度快,线程安全。

    代码3

    #include <iostream>
    #include <stdlib.h>
    #include <thread>
    #include <atomic>
    
    using namespace std;
    int count(0);
    
    void run()
    {
        for(int i(0);i<1000000;i++)
        {
            count++;
            cout<<"	"<<i<<"	"<<count<<"	";
        }
    }
    
    int main()
    {
        auto n=thread::hardware_concurrency();
    
        thread* pt[n];
        for(int z=0;z<n;z++)
        {
            pt[z]=new thread(run);
            pt[z]->detach();
    
        }
    
        cout<<"Finally count is 	"<<count<<endl;
        cout<<"Used "<<n <<"threads"<<endl;
    
    
    
    
        cin.get();
        return 0;
    }
     

    运行结果不是1000000×2.

     1 #include <stdlib.h>
     2 #include <thread>
     3 #include <atomic>
     4 
     5 using namespace std;
     6 int count(0);
     7 
     8 void run()
     9 {
    10     for(int i(0);i<1000000;i++)
    11     {
    12         count++;
    13         cout<<"	"<<i<<"	"<<count<<"	";
    14     }
    15 }
    16 
    17 int main()
    18 {
    19     auto n=thread::hardware_concurrency();
    20 
    21     thread* pt[n];
    22     for(int z=0;z<n;z++)
    23     {
    24         pt[z]=new thread(run);
    25         pt[z]->detach();
    26 
    27     }
    28 
    29     cout<<"Finally count is 	"<<count<<endl;
    30     cout<<"Used "<<n <<"threads"<<endl;
    31 
    32 
    33 
    34 
    35     cin.get();
    36     return 0;
    37 }
     

    运行结果是1000000×2.正确

    <li>atomic 声明方式为 atomic<int> a(100); 等号初始化会报错

    <li>vim 按CTRL+S 后假死按 CTRL+q 退出

    个人博客地址 https://www.ev0l.art 正在学习CPP,希望有一朝能做CPP开发。 没学历,野路子
  • 相关阅读:
    451. Sort Characters By Frequency
    424. Longest Repeating Character Replacement
    68. Text Justification
    44. Wildcard Matching
    160. Intersection of Two Linked Lists
    24. Swap Nodes in Pairs
    93. 递归实现组合型枚举
    98. 分形之城
    97. 约数之和
    96. 奇怪的汉诺塔
  • 原文地址:https://www.cnblogs.com/dev995/p/12132726.html
Copyright © 2011-2022 走看看