Итак, у меня есть процесс, который создает три потока, которые выполняют свою задачу, когда они распечатывают операцию на консоли.
В основном я естьПроблемы параллелизма, связанные с sdtout
pthread_create (&window_manager, NULL, (void *) window_manager_receiver_func, (void *)(&args));
pthread_create (&send_ack, NULL, (void *) send_ack_func, (void *)(&args));
pthread_create (&receiver, NULL, (void *) receiver_func, (void *)(&args));
pthread_create (&file_writer, NULL, (void *) file_writer_func, (void *)(&args));
pthread_join(window_manager, NULL);
pthread_join(send_ack, NULL);
pthread_join(receiver, NULL);
pthread_join(file_writer, NULL);
И в каждом thread_func я есть printf("Thread ... starting")
с последующим fflush(stdout)
, чтобы определить, если потоки начинают работать. Проблема в том, что не все потоки печатают эту строку, я думаю, это проблема синхронизации? Как я могу это решить? Я нуждаюсь в потоках печати на консоли, чтобы убедиться, что они делают то, что должны делать.
Идея, которую я имею, это создать другой поток, который является единственной печатью на консоли (поэтому на stdio не возникает проблем с параллелизмом), а другие потоки отправляют сообщения этому, используя именованные каналы (fifo), - это это возможно? Есть ли лучшие идеи?
Вы пытались 'fflush (stdout);' после 'printf();'? –
Да. Каждый вызов printf имеет следующий fflush. – Crysis85
По умолчанию используется 'stdout' строка. Вы можете полностью отключить буферизацию, выполнив что-то вроде ['setvbuf (stdout, NULL, _IONBF, 0);'] (http://en.cppreference.com/w/c/io/setvbuf), если вы хотите, перерывы, чтобы быть незамедлительным. Имейте в виду, что это, скорее всего, не будет делать именно то, что вы хотите. Если вы хотите, чтобы каждый поток гарантировал полный msg * для каждого вызова * без чередования, вы, скорее всего, будете вынуждены обернуть свой собственный эквивалент var my-myprintf' с использованием общей блокировки (например, мьютекса). По внешнему виду, * оба из них в тандеме могут быть тем, что вы ищете. – WhozCraig