@izirayd

C++ std::thread разное поведение на linux и windows, в чем может быть проблема?

Столкнулся с странным поведением std::thread, при использовании метода detach. Пример кода:
#include <iostream>
#include <thread>  
#include <chrono>

void foo() {
	std::cout << "\nThread 1(foo())";
}

int main()
{
	std::thread first(foo);

	first.detach();
	std::cout << "\nDetach";

	for (;;)
		std::this_thread::sleep_for(std::chrono::milliseconds(100));
	return 0;
}


На Windows поток будет создан, на Linux нет. Какую деталь я упустил?

ad2d9-clip-42kb.png
  • Вопрос задан
  • 968 просмотров
Решения вопроса 1
nekipelov
@nekipelov
Поток создан, работает буферизация ввода-вывода. Измените строку:

std::cout << "\nThread 1(foo())";

на

std::cout << "\nThread 1(foo())" << std::endl;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
AxianLTD
@AxianLTD
Разные способ реализации потоков на уровне ОС. Linux - https://en.wikipedia.org/wiki/LinuxThreads, в Windows - https://msdn.microsoft.com/en-us/library/windows/d... Linux потоки сделаны на основе механизма процессов.
Все это легко гуглится, и почему вас вообще это беспокоит? Стандартная библиотека для того и стандартная библиотека чтобы скрывать от вас детали реализации.
Ответ написан
Комментировать
TrueBers
@TrueBers
Гуглю за еду
Изучите буфферизацию стандартных потоков, там много нюансов.

1. Как вариант, используйте std::cerr, он небуфферизирован, но вывод будет идти в stderr. Для буферизированного stderr используйте std::clog
2. Второй вариант: если не нужна новая строка, используйте явный << std::flush.
3. Если нужна новая строка в конце и сброс буфферов, добавляйте к потоку << std::endl. Он содержит в себе неявный flush.
4. std::cout же пишет в собственный буфер, а когда он сбросит его в stdout, никто кроме него самого не знает. Для важных данных его не используют, для быстрых и частых — тоже, т. к. медленный.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы