Что не так с моим кодом?Значение глобальной переменной изменилось при использовании семафора - PullRequest
0 голосов
/ 20 июля 2011
          #include<pthread.h>
          #include<stdio.h>
          #include<semaphore.h>
              void func();
              int a;
              int main()
              {  

                 pthread_t thread1;
                 sem_t semaphore1;
                 sem_init(&semaphore1,0,1);
                 pthread_create(&thread1,NULL,(void *)func,NULL);
                 sem_wait (&semaphore1);
                 a=62;
                 printf("%d",a); \\ as i found on google 
                 sleep(2);   \\ i believe a value should be sticked to 62
                 sleep(1);    \\ but output shows different why?
                 printf("%d",a);
                 sem_post(&semaphore1);
              } 
            void func()
             {  
              a=45;
              sleep(1);
              a=32;
              a=75;
           printf("hello");
             }

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

Но когда я попробовал этот код, выводом будет

           62 
           hello 
           75.

Значение a изменилось, но обратите внимание, что printf ("% d", a) находится под sem_wait. Что не так с моим кодом?

1 Ответ

2 голосов
/ 20 июля 2011

Семафоры предлагают только рекомендательную блокировку. Они не знают о переменных и тому подобное, они блокируют области вашего кода . Они ничего не применяют, поэтому вы должны сами звонить wait и post.

Вот что на самом деле означают wait и post, когда они используются в вашем примере.

sem_wait (&semaphore1); /* AKA "may I enter this region" */

sem_post(&semaphore1); /* AKA "I am done with this region. */

Как я вижу, main запрашивает разрешение перед входом. func не запрашивает разрешения до изменения a.

Так func должен wait и post.

void func()
{
    sem_wait (&semaphore1);
    a=45;
    sleep(1);
    a=32;
    a=75;
    printf("hello");
    sem_post (&semaphore1);
}

Конечно, для этого sempahore1 должен быть доступен глобально.

...