[C++병발 과 다 중 스 레 드]4여러 스 레 드,데이터 공유 문제 분석 만 들 기

3180 단어 c++백 엔 드
여러 스 레 드 생 성 및 대기
용기 류 를 사용 하여 여러 스 레 드 를 간단하게 관리 합 니 다.
#include 
#include 
#include 

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 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 
#include 
#include 

using namespace std;

vector 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 
#include 
#include 

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 m_queue;
};

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

    Handle handler;

    thread th1(&Handle::inMsgRevQueue, std::ref(handler));
    thread th2(&Handle::inMsgRevQueue, 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:       。

좋은 웹페이지 즐겨찾기