/ / C ++ Неочаквано мултитъканско поведение - c ++, multithreading, mutex

C ++ неочаквано мултитъканско поведение - c ++, multithreading, mutex

Аз се учат много-threading в C + + и току-що са открили mutex. Моят код е по-долу:

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

От моето разбиране, mutex ще позволи само достъп до един ресурс в даден момент. Така че mutex ще бъде заключена от първата нишка, която го нарича (Thread1). Когато main конецът се опитва да получи достъп до мутекса, той е блокиран, докато мутексът не бъде отключен Thread1, Той ще бъде деблокиран веднъж cout е изпълнила main ще бъде разрешено да изпълнява.

Очаквам резултатът да бъде вмъкване на повиквания като Thread1, Main, Thread1, Main и т.н.

Въпреки това, вместо това получавам по-нисък резултат от стандартен out. Образецът остава същият за всеки брой итерации:

Thread1: 0
Thread1: -1
Thread1: -2
Main: 0
Main: 1
Main: 2

Отговори:

2 за отговор № 1

Първо осъзнайте, че реда на изпълнение е не-детерминистичен, така че това, което имате, е напълно валидно - и следващия път, когато го изпълните, може да получите напълно различен ред.

Увеличих броя на повторенията за всяка нишка до 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 е най-дългия в този случай), идващи от една нишка. Друг път, когато го пуснах, имах перфектно интерфейс, така че цялата работа се изпълни като един изход от Thread 1, следван от един изход от Main и повтарящ се.

Най-долу: вашият код работи както се очаква.