Jump to content

    

cout/printf из разных потоков

std::cout и/или printf() - потокозащищённые (в Linux)?

Share this post


Link to post
Share on other sites

Начиная с POSIX.1-2001 почти все стандартные функции (и cout/printf  в том числе) должны быть thread-safe. Смотрите пункт 2.9.1 здесь.

Share this post


Link to post
Share on other sites
20 минут назад, arhiv6 сказал:

Начиная с POSIX.1-2001 почти все стандартные функции (и cout/printf  в том числе) должны быть thread-safe. Смотрите пункт 2.9.1 здесь.

спасибо

Share this post


Link to post
Share on other sites
15 hours ago, juvf said:

std::cout и/или printf() - потокозащищённые (в Linux)?

Что вы хотите от "потокозащищённости"?

Чтобы несколько элементов вывода, последовательно выводимые единым оператором std::cout и/или printf(), выглядели как единый фрагмент вывода (цельная строка и т.п.)? - Нет.

Что можно их использовать в потоковых функциях? Да ... используйте. :acute:

Share this post


Link to post
Share on other sites
8 минут назад, Olej сказал:

Что вы хотите от "потокозащищённости"?

я хочу из разных потоков выводить дебажную в терминал. в одном потоке

printf("string 1\n");

printf("string 2\n");

printf("string 3\n");

в другом потоке

printf("text 1\n");

printf("text 2\n");

printf("text 3\n");

 

1) я хочу чтобы прога не легла при одновременном вызове std::cout или printf()  с разных потоков.

2) я хочу видеть в терминале вывод с обоих потоков.... как минимум построчно разделённые, что-то типа

string 1

string 2

text 1

text 2

text 3

string 3

 

 

Share this post


Link to post
Share on other sites
2 minutes ago, juvf said:

1) я хочу чтобы прога не легла при одновременном вызове std::cout или printf()  с разных потоков.

Не ляжет.

3 minutes ago, juvf said:

2) я хочу видеть в терминале вывод с обоих потоков.... как минимум построчно разделённые, что-то типа

А этого вам никто не гарантирует ... по части "построчно разделённые".

Share this post


Link to post
Share on other sites
23 минуты назад, juvf сказал:

я хочу видеть в терминале вывод с обоих потоков.... как минимум построчно разделённые, что-то типа 

Вроде в пределах вызова одного printf, его текст выведется целиком. Если нужно объединить несколько printf, это можно сделать с помощью мьютексов или функций flockfile/funlockfile. Подробно этот момент расписан на stackoverflow в этой теме.

Share this post


Link to post
Share on other sites
13 минут назад, arhiv6 сказал:

Это можно сделать с помощью мьютексов

ну это понятно.... с помощью мьютексов можно сделать и 1) и 2). Просто не хотел заморачиваться. Думал может вызов printf() помещает в поток текст единым куском, и параллельный вызов printf() "не порвёт" строку из др потока.

 

ps кстати.....  printf() что делает.... открывает поток stdout , помещает текст, закрывает поток.... если в первом таске открыли stdout, то во втором таске printf() не заблокируется на  открытии stdout?

Share this post


Link to post
Share on other sites
15 минут назад, arhiv6 сказал:

Вроде в пределах вызова одного printf, его текст выведется целиком.

это и есть 2). спс

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now