2015-10-27 3 views
0

Я хочу отправить сообщение из главного процесса в каждый поток и распечатать его (да, в каждом потоке). Как мне это сделать?Передача сообщения между потоками в C

Мне нужно отправить сообщение от мастера в поток, затем распечатать его в потоке и закончить.

Я получил этот код:

#include <stdio.h> 
#include <pthread.h> 
#include <stdlib.h> 

void * thread1() 
{ 
     while(1){ 
       printf("Hello!!\n"); 
     } 
} 

void * thread2() 
{ 
     while(1){ 
       printf("How are you?\n"); 
     } 
} 

int main() 
{ 
     int status; 
     pthread_t tid1,tid2; 

     pthread_create(&tid1,NULL,thread1,NULL); 
     pthread_create(&tid2,NULL,thread2,NULL); 
     pthread_join(tid1,NULL); 
     pthread_join(tid2,NULL); 
     return 0; 
} 
+0

Используйте PostThreadMessage, как описано здесь https://msdn.microsoft.com/en-us/library/windows/desktop/ms644946%28v=vs.85%29.aspx – milevyo

+2

Однако вы хотите. Нет «одного правильного пути». Вы можете использовать очередь для каждого потока. Вы можете использовать общую очередь и каждый поток отслеживать, какое сообщение обрабатывается последним. Вы можете использовать файл. Вы можете использовать трубу. В любом случае, вы хотите. –

ответ

0

Поскольку основной поток и все суб резьбы используют одни и те же данные,

основной поток помещает сообщение в буфере данных, наряду с счетчик «время печати» и счетчик номеров сообщений.

0) Each sub thread is looping, watching that 'times to print' counter, 
when that counter becomes greater than 0, then 
checks if they have already output that message[number] 
if they have NOT output that message then 
1) save new message number 
2) lock a mutex, 
3) prints the message, 
4) decrements the count of times that message to be printed, 
5) unlocks the mutex. 
branch back to 0) 

0) The main thread is looping, waiting for the 'times to print' counter to reach 0. 


when it does reach 0, 
1) set the next message 
2) updates the 'times to print' counter, 
3) increment the message number counter 
if not all messages sent, then branch back to 0) 

Конечно, суб потоки будут нуждаться в какой-то признак того, что не будет больше никаких сообщений, возможно, главный поток установки "раз напечатает счетчик -1

Примечание: все вспомогательные потоки используют один и тот же мьютекс

Возможно, необходимо пометить два счетчика в данных как «volatile», так что подпионы будут получать новую копию каждый раз.

Предлагайте каждый поток имеет некоторую величину задержки между проверками на «раз, чтобы напечатать» счетчик, поэтому циклы процессора не спер

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

+0

предлагают начать каждый дополнительный поток с параметром, обозначающим его «номер», а затем внутри вспомогательного потока содержать массив, в котором каждый вспомогательный поток хранит любые данные, локальные для этого экземпляра вспомогательного потока в записи [переданной в параметре]. – user3629249

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