Потоки в C ++ Шаблон чередования - PullRequest
0 голосов
/ 08 октября 2019

В этой программе я пытаюсь напечатать свое имя пользователя, а затем создать две темы. Я хочу, чтобы каждый поток печатал свой идентификатор потока, входил в цикл и периодически что-то отображал.

Вот код, который у меня есть

#include <iostream>
#include <thread>
#include <chrono>
#include <mutex>
#include <string>


void task(std::string threadNum)
{
    std::thread::id this_id = std::this_thread::get_id();
    std::cout << threadNum << " : " << this_id << std::endl;

    for(int i=0; i<1000; i++){
        if(i == 300 or i == 600 or i == 900){
            std::cout << threadNum << " has reached step: " << i << std::endl; 
        }
    }

}

int main()
{
    std::cout << "Your Username Is: " << getenv("USER") << std::endl;
    std::thread t1(task, "Thread 1");
    std::thread t2(task, "Thread 2");
    t1.join();
    t2.join();

}

, и я получаю разные выходные данные при каждом запускепрограмма, например

Your Username Is: gansaikhanshur
Thread 2 : Thread 1 : 0x70000741e000
Thread 2 has reached step: 0x70000739b000300
Thread 1 has reached step: 300
Thread 2 has reached step: 600
Thread 2 has reached step: 900

Thread 1 has reached step: 600
Thread 1 has reached step: 900

Thread1 и Thread 2 не показывает свой идентификатор потока, как это должно быть. Почему я все время получаю разные результаты? и возможно ли для меня, чтобы поток 1 и поток 2 отображали их правильные идентификаторы потока?

1 Ответ

0 голосов
/ 08 октября 2019

Именно так работают потоки - они работают независимо, и любые их побочные эффекты могут отображаться с чередованием в любом порядке. Если вы хотите, чтобы этого не произошло, вам нужно синхронизироваться. Например, если вы хотите убедиться, что строки, записанные в cout, не перепутаны, вы можете заблокировать вывод каждой строки:

std::mutex cout_lock;

void task(std::string threadNum)
{
    std::thread::id this_id = std::this_thread::get_id();
    {
        std::lock_guard<std::mutex> lock(cout_lock);
        std::cout << threadNum << " : " << this_id << std::endl;
    }

    for(int i=0; i<1000; i++){
        if(i == 300 or i == 600 or i == 900) {
            std::lock_guard<std::mutex> lock(cout_lock);
            std::cout << threadNum << " has reached step: " << i << std::endl; 
        }
    }
}

lock_guard дает вам хороший простой и безопасный исключенийспособ управления операциями блокировки / разблокировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...