C ++意外多线程的行为

问题描述 投票:1回答:1

我与多线程在C ++中使用互斥工作。我的代码如下:

#include "stdafx.h"
#include <thread>
#include <iostream>
#include <string>
#include <mutex>
using namespace std;

std::mutex mu;

void shared_print(string msg, int i) {
    std::lock_guard<std::mutex> guard(mu);
    cout << msg << i << endl;
}

void function_1() {
    for (int i = 0; i > -3; i--)
        shared_print("Thread1: ", i);
}

int main() {
    std::thread thread1(function_1);

    for (int i = 0; i < 3; i++)
        shared_print("Main: ", i);

    thread1.join();
    return 0;
}

从我的理解,互斥体将只允许在同一时间访问一个单一的资源。所以互斥会调用它(Thread1)的第一个线程被锁定。当main线程试图访问该互斥,它被阻塞,直到该互斥已由Thread1解锁。一旦cout已经执行在其main将被允许执行这将是畅通的。

我希望得到的结果是交错的呼叫如Thread1, Main, Thread1, Main等。

但是,相反,我得到标准输出下面的结果。该模式仍然是任何迭代次数相同:

Thread1: 0
Thread1: -1
Thread1: -2
Main: 0
Main: 1
Main: 2
c++ multithreading mutex
1个回答
2
投票

首先认识到,执行的顺序是不确定的,所以你得到了什么是完全有效的 - 并且在下一次运行它的时候,你可能会得到完全不同的次序。

我增加迭代次数每个线程运行32的是,在过去的几个迭代是这样的:

Thread1: -22
Main: 22
Thread1: -23
Main: 23
Main: 24
Thread1: -24
Main: 25
Thread1: -25
Main: 26
Thread1: -26
Main: 27
Thread1: -27
Thread1: -28
Thread1: -29
Main: 28
Main: 29
Main: 30
Main: 31
Thread1: -30
Thread1: -31

所以,有时我们得到交错,其他时候我们得到短期运行(4在这种情况下,最长)从一个线程来。我跑了其他时候,我得到了完美交织,使整个事情跑了从线程1一个输出,然后从主一个输出,并重复。

底线:你的代码工作正常。

© www.soinside.com 2019 - 2024. All rights reserved.