美文网首页
2018-05-08

2018-05-08

作者: try312 | 来源:发表于2018-05-09 00:46 被阅读0次

多线程

初级概念与传参

#include<thread>
#include<Windows.h>
using namespace std;

void run()
{
    MessageBoxA(0,"SSSS","RRRR",0);
}


void showmsg(const char*str1,const char*str2)
{
    MessageBoxA(0, str1, str2, 0);
}

void mainxx1()
{
    //同步 阻塞
    //run();
    //run();
    //run();

    //并行 异步 非阻塞
    //thread t1(run);  //根据函数初始化 并执行
    //thread t2(run);
    //thread t3(run);

    thread t[5]{thread(run),thread(run) ,thread(run) ,thread(run), thread(run) };  //初始化

    //堆上开辟线程数组
    thread *pthread(new thread[5]{ thread(run),thread(run) ,thread(run) ,thread(run), thread(run) });

    thread t2(showmsg,"sss","ddddd"); //多线程传参


    cin.get();
}

join deatch

#include<array>

void show()
{
    MessageBoxA(0, "SSSS", "RRRR", 0);
}



void mainxx2()
{
    //array<thread, 3>threads{thread(show), thread(show), thread(show)};
    //for (size_t i = 0; i < 3; i++)
    //{
    //  threads[i].join();  //主线程等待当前线程结束后再退出
    //}

    auto n = thread::hardware_concurrency(); //获取CPU核心个数
    cout << n << endl;

    thread th(run);
    th.detach(); //脱离主线程绑定 主线程挂了 不影响子线程退出出错
    //detach以后 线程无法通信  无法join

    cout << th.joinable() << endl;  //判断是否可以加入等待 

    cin.get();
}

原子变量 互斥锁 与 线程安全

线程安全 多线程访问冲突 冲突不安全

#include<mutex>
#include<atomic>

//int num = 0;

mutex m; //互斥  加锁解锁浪费时间
atomic_int  num{ 0 }; //原子变量 不会发生线程冲突 线程安全

void run1()
{
    for (size_t i = 0; i < 10000000; i++)
    {
        m.lock();
        num++;
        m.unlock();
    }

}

//全局变量 冲突  结果不正确  速度快
//mutex 加锁   结果正确 速度慢
//atmoic       结果正确 速度比mutex快

void mainxx3()
{
    clock_t start = clock();

    thread th1(run);
    thread th2(run);
    th1.join();
    th2.join();

    clock_t end = clock();
    cout << end - start <<"ms"<< endl;

    cin.get();
}

lambda表达式 与 多线程

#include<chrono>

void mainxx4()
{
    auto fun = []() {MessageBoxA(0, "SSSS", "RRRR", 0);};

    thread  th3([]() {
        cout << this_thread::get_id() << "  " << std::endl,//获取当前线程ID
            this_thread::yield(); //让CPU先执行其他线程 空闲
            this_thread::sleep_for(chrono::seconds(3));  //等待3秒
            //this_thread::sleep_until();  //在某个时刻到来之前一直等待
    }); 

    thread  th4([]() {
        cout << this_thread::get_id() << endl;
    }); 


    thread th1([]() { MessageBoxA(0, "SSSS", "RRRR", 0); });
    thread th2(fun);
    

    cin.get();
}

相关文章

网友评论

      本文标题:2018-05-08

      本文链接:https://www.haomeiwen.com/subject/vyvgrftx.html