2014-01-06 4 views
3

Хорошо, я изучаю многопоточность в C++ 11, используя Mac. Насколько я знаю, все потоки выполняются одновременно. Я нашел следующий код из hereмногопоточность в C++ 11?

// thread example 
#include <iostream>  // std::cout 
#include <thread>   // std::thread 

void foo() 
{ 
    std::cout << "\nIn foo \n"; 
} 

void bar(int x) 
{ 
    std::cout << "\nIn bar \n"; 
} 

int main() 
{ 
    std::thread first (foo);  // spawn new thread that calls foo() 
    std::thread second (bar,0); // spawn new thread that calls bar(0) 

    std::cout << "main, foo and bar now execute concurrently...\n"; 

    // synchronize threads: 
    first.join();    // pauses until first finishes 
    second.join();    // pauses until second finishes 

    std::cout << "foo and bar completed.\n"; 

    return 0; 
} 

Каждый раз, когда я запускаю код, я получаю странные результаты, как в следующем примере

м

aIIinnn, бф aofroo O

и bar теперь выполняется одновременно ... foo и bar завершены.

что мне не хватает?

+3

ЭТО НЕ ДУБЛИКАЦИЯ СВЯЗАННОГО ОТВЕТА. Несмотря на названия, OP здесь не задает общий вопрос о std :: cout: он задает вопрос о конкретной проблеме, которая может привести к конкретным ответам (как это фактически предлагается до закрытия). Не стоит закрывать дубликат. По крайней мере, не так. –

ответ

3

Это происходит потому, что оба нитей писать на стандартный вывод станд :: в то же самое время. Вам нужно будет добавить механизмы синхронизации потоков (мьютексы, семафоры и т. Д.), Чтобы убедиться, что только один поток записывает в std :: out за раз. Проблема, с которой вы сталкиваетесь, связана с тем, что потоки параллельны друг другу, и это их цель. Найдите мьютекс или семафор и интегрируйте их в свой код, и вы решите проблему.

Если вы запустите свой текущий код несколько раз, вы увидите, что результат будет меняться каждый раз, когда вы выполняете код, или, по крайней мере, в большинстве случаев.

4

Вы печатаете через std::cout из двух потоков одновременно. Хотя это, по-видимому, не гонка данных и, таким образом, «безопасная» [*], вывод ее, как вы можете видеть, не имеет особого значения. Вероятно, вы хотите использовать std::mutex для ограничения доступа или использовать библиотеку IO, которая обеспечивает более надежные гарантии.

[*], если не называется std::cout.sync_with_stdio(false)

2

Код содержит две части. Первая часть - thread first, thread second и main, работающая одновременно (то есть в то же время). В результате печать "\n In foo \n", "\n In bar \n" и "main, foo and bar now execute concurrently...\n" будет происходить одновременно, и, следовательно, выход будет случайным образом смешать их (более формально это называется racing).

Иными словами, первая часть печатает «случайный выход», упомянутый в OP, который является тасованием "\n In foo \n", "\n In bar \n" и "main, foo and bar now execute concurrently...\n".

После первой части основная нить будет останавливаться до первой резьбы и второй резьбы (известна как synchronization.) В результате печать "foo and bar completed.\n" будет всегда генерировать точный выход.

Смежные вопросы