2015-01-18 3 views
1

Итак, у меня есть процесс, который создает три потока, которые выполняют свою задачу, когда они распечатывают операцию на консоли.
В основном я естьПроблемы параллелизма, связанные с 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), - это это возможно? Есть ли лучшие идеи?

+0

Вы пытались 'fflush (stdout);' после 'printf();'? –

+0

Да. Каждый вызов printf имеет следующий fflush. – Crysis85

+0

По умолчанию используется 'stdout' строка. Вы можете полностью отключить буферизацию, выполнив что-то вроде ['setvbuf (stdout, NULL, _IONBF, 0);'] (http://en.cppreference.com/w/c/io/setvbuf), если вы хотите, перерывы, чтобы быть незамедлительным. Имейте в виду, что это, скорее всего, не будет делать именно то, что вы хотите. Если вы хотите, чтобы каждый поток гарантировал полный msg * для каждого вызова * без чередования, вы, скорее всего, будете вынуждены обернуть свой собственный эквивалент var my-myprintf' с использованием общей блокировки (например, мьютекса). По внешнему виду, * оба из них в тандеме могут быть тем, что вы ищете. – WhozCraig

ответ

1

Попробуйте

#define mtprintf(...) do {        \ 
     char message[1024];        \ 
     snprintf(message, sizeof(message), __VA_ARGS__); \ 
     write(STDOUT_FILENO, message, strlen(message)); \ 
    } while (0); 

таким образом вы избежите буферизации полностью, хотя вы можете видеть, что существует ограничение, также AFAIK printf() потокобезопасен в glibc, но так как я не знаю, какой стандарт с библиотекой вам используются, это, скорее всего, будет работать.

+0

Я считаю, что использую printf в stdio.h, это то, что вы имеете в виду со стандартной библиотекой c, которую я использую?
В любом случае ваш макрос теперь работает «приветственные сообщения» для всех начальных тем. – Crysis85

+0

нет, это 'glibc'? вы на Linux? –

+0

Да, я могу, что некоторые из этих потоков не начинаются вообще? (никаких компиляции ошибок или предупреждающих сообщений вообще) – Crysis85

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