2013-12-06 2 views
1

Я пытаюсь решить проблему с писателем и читателем. Я пытаюсь использовать функции семафора Windows.Синхронизация потоков Windows с созданием семафора

Это очень просто, как следует

 char n[200]; 
     volatile HANDLE hSem=NULL; // handle to semaphore 

Функция записи для консоли. Какой выпуск семафора для процесса чтения.

 void * write_message_function (void *ptr) 
     { 


     /* do the work */ 
     while(1){ 
      printf("Enter a string"); 
      scanf("%s",n); 

      ReleaseSemaphore(hSem,1,NULL); // unblock all the threads 
     } 

     pthread_exit(0); /* exit */ 
     } 

Сообщение для печати дождитесь освобождения от сообщения для печати сообщения.

 void * print_message_function (void *ptr) 
     { 


     while(1){ 
      WaitForSingleObject(hSem,INFINITE); 
      printf("The string entered is :"); 
      printf("==== %s\n",n); 

     } 

     pthread_exit(0); /* exit */ 
     } 

Основная функция запуска приложения.

 int main(int argc, char *argv[]) 
    { 

    hSem=CreateSemaphore(NULL,0,1,NULL); 
    pthread_t thread1, thread2; /* thread variables */ 
    /* create threads 1 and 2 */  
    pthread_create (&thread1, NULL, print_message_function, NULL); 
    pthread_create (&thread2, NULL, write_message_function, NULL); 

    pthread_join(thread1, NULL); 
    pthread_join(thread2, NULL); 

    /* exit */ 
    CloseHandle(hSem); 

    } 

Программа выполняет, но не отображает консоль ввода строк.

ответ

0

ReleaseSemaphore в write_message_function заставит следующее:

  1. print_message_function начнет выход и
  2. write_message_function выход будет и сканирования для ввода.

Эти две вещи происходят в то же время. Использование семафора для запуска вывода - штраф. Однако использование MaximumCount=1 - это недостаток возможностей, у вас могут быть множественные входы до выхода. Но главная проблема здесь в том, что ресурсы ввода-вывода и использование char n[200]; не являются , реализованными поточно-безопасными. См. What is meant by “thread-safe” code?. Вам все равно придется защищать эти ресурсы, например, mutex или critical section.

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