C++并发与多线程 4_创建多个线程数据共享问题分析

Posted TianSong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++并发与多线程 4_创建多个线程数据共享问题分析相关的知识,希望对你有一定的参考价值。

创建和等待多个线程

使用容器类简单管理多个线程。

#include <iostream>
#include <thread>
#include <vector>

using namespace std;

void thread_func(int i)
{
    cout << "thread_func id : " << std::this_thread::get_id() << " " << i << endl;
}

int main()
{
    cout << "main begin" << endl;

    vector<thread> threads;

    for (int i=0; i<10; ++i)
        threads.emplace_back(thread(thread_func, i));

    for (int i=0; i<10; ++i)
        threads.at(i).join();

    cout << "main end" << endl;

    return 0;
}

输出:[输出结果每次可能是不一致的,因为子线程间竞争运行未做同步处理]

main begin
thread_func id : 2 0
thread_func id : 3 1
thread_func id : 5 3
thread_func id : 6 4
thread_func id : 4 2
thread_func id : 8 6
thread_func id : 9 7
thread_func id : 7 5
thread_func id : 10 8
thread_func id : 11 9
main end

数据共享问题分析

只读

多线程只读同一资源是安全的。

#include <iostream>
#include <thread>
#include <vector>

using namespace std;

vector<int> g_iv{1, 2, 3};

void thread_func()
{
    cout << "thread_func id : " << std::this_thread::get_id() << " | "<< g_iv[0] << " " << g_iv[1] <<  " " << g_iv[2] << endl;
}

int main()
{
    cout << "main begin" << endl;

    thread th1(thread_func);
    thread th2(thread_func);

    th1.join();
    th2.join();

    cout << "main end" << endl;

    return 0;
}

输出:[输出结果每次可能是不一致的,因为子线程间竞争运行未做同步处理]

main begin
thread_func id : 2 | 1 2 3
thread_func id : 3 | 1 2 3
main end

同时读写

多线程同时读、写同一资源会导致异常结束。

#include <iostream>
#include <thread>
#include <queue>

using namespace std;

class Handle {
public:
    void inMsgRevQueue()
    {
        for (int i=0; i<100000; ++i)
        {
            cout << "inMsgRevQueue() : " << i << endl;
            m_queue.push(i);
        }
    }

    void outMsgRevQueue()
    {
        for (int i=0; i<100000; ++i)
        {
            if (!m_queue.empty())
            {
                cout << "outMsgRevQueue() : " << m_queue.front() << endl;
                m_queue.pop();
            }
        }
    }

private:
    queue<int> m_queue;
};

int main()
{
    cout << "main begin" << endl;

    Handle handler;

    thread th1(&Handle::inMsgRevQueue, std::ref(handler));
    thread th2(&Handle::outMsgRevQueue, std::ref(handler));

    th1.join();
    th2.join();

    cout << "main end" << endl;

    return 0;
}

输出:

......
inMsgRevQueue() : 487
inMsgRevQueue() : 488
inMsgRevQueue() : 489
inMsgRevQueue() : 490
inMsgRevQueue() : 491
inMsgRevQueue() : 410
10:39:05: 程序异常结束。

以上是关于C++并发与多线程 4_创建多个线程数据共享问题分析的主要内容,如果未能解决你的问题,请参考以下文章

C++并发与多线程 2_线程启动结束,创建线程多种方法,join,detach

C++并发与多线程 12_recursive_mutextimed_mutexrecursive_timed_mutex

C++并发与多线程 11_std::atomic叙谈std::launch(std::async) 深入

C++并发与多线程 3_线程传参数详解,detach 注意事项

C++并发与多线程 10_shared_futureautomic

C++并发与多线程 9_asyncfuturepackaged_taskpromise