Проблема многопоточного ввода-вывода в C ++ с std :: endl - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь узнать, как использовать библиотеку потоков C ++ 11, а затем я запутался в выводе следующего кода.

#include <iostream>
#include <thread>
#include <mutex>

std::mutex mtx;

void thread_function()
{
    std::cout << "Inside Thread :: ID = " << std::this_thread::get_id() << std::endl;
}

int main()
{
    std::thread threadObj1(thread_function);
    std::thread threadObj2(thread_function);

    if (threadObj1.get_id() != threadObj2.get_id())
        std::cout << "Both threads have different id" << std::endl;

    threadObj1.join();
    threadObj2.join();
    std::cout<<"From Main Thread :: ID of Thread 1 = "<<threadObj1.get_id()<<std::endl;
    std::cout<<"From Main Thread :: ID of Thread 2 = "<<threadObj2.get_id()<<std::endl;


    return 0;
}

Я присоединяю каждый std :: cout с помощью std :: endl, чтобы очистить буфер и вывести символ '/ n'. Тем не менее, наконец, я получил следующий результат:

Both threads have different idInside Thread :: ID = Inside Thread :: ID = 
0x700003715000
0x700003692000
From Main Thread :: ID of Thread 1 = 0x0
From Main Thread :: ID of Thread 2 = 0x0
Program ended with exit code: 0

Кажется, что '/ n' перед тем, как внутренняя нить исчезла. Не могли бы вы помочь мне разобраться? Большое вам спасибо!

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Я думаю, что я также должен получить три '\ n', верно?

В вашем выводе три '\n' рассматриваемых символа . Они находятся в конце первых трех строк вывода.

Я думаю, вы, возможно, неправильно поняли, что означает эта строка из вашего примера:

std::cout << "Inside Thread :: ID = " << std::this_thread::get_id() << std::endl;

В этой строке кода есть четыре отдельных вызова функций. Эта строка делает то же самое, что и эти четыре строки:

std::cout << "Inside Thread :: ID = ";
auto id = std::this_thread::get_id();
std::cout << id;
std::cout << std::endl;

Даже если предположить, что объект std::cout полностью синхронизирован, Вы не сделали ничего, чтобы помешать различным потокам чередовать отдельные вызовы функций. Например.,

  • вызов основного потока std::cout << "Both threads have different id";
  • threadObj1 звонит std::cout << "Inside Thread :: ID = ";
  • threadObj2 вызывает std::cout << "Inside Thread :: ID = ";
  • вызов основного потока std::cout << std::endl;
  • threadObj1 звонит std::cout << std::this_thread::get_id();
  • threadObj1 звонит stc::cout << std::endl;
  • и т.д.
0 голосов
/ 10 января 2019

У вас есть 3 потока, которые обращаются к cout без какой-либо синхронизации. Вы определили mtx, но он не используется, почему?

Добавить lock_guard для защиты оператора cout:

void thread_function()
{
    std::lock_guard<std::mutex> lk{mtx};
    std::cout << "Inside Thread :: ID = " << std::this_thread::get_id() << std::endl;
}

    if (threadObj1.get_id() != threadObj2.get_id())
    {
        std::lock_guard<std::mutex> lk{mtx};
        std::cout << "Both threads have different id" << std::endl;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...