2009-03-25 4 views
1
#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <string.h> 
#include <pthread.h> 
#include <semaphore.h> 
void *thread_function(void *arg); 
sem_t bin_sem; 
#define WORK_SIZE 1024 
char work_area[WORK_SIZE]; 
int main() { 
    int res; 
    pthread_t a_thread; 
    void *thread_result; 
    res = sem_init(&bin_sem, 0, 0); 
    if (res != 0) { 
     perror(“Semaphore initialization failed”); 
     exit(EXIT_FAILURE); 
    } 
    res = pthread_create(&a_thread, NULL, thread_function, NULL); 
    if (res != 0) { 
     perror(“Thread creation failed”); 
     exit(EXIT_FAILURE); 
    } 
    printf(“Input some text. Enter ‘end’ to finish\n”); 
    while(strncmp(“end”, work_area, 3) != 0) { 
     fgets(work_area, WORK_SIZE, stdin); 
     sem_post(&bin_sem); 
    } 
    printf(“\nWaiting for thread to finish...\n”); 
    res = pthread_join(a_thread, &thread_result); 
    if (res != 0) { 
     perror(“Thread join failed”); 
     exit(EXIT_FAILURE); 
    } 
    printf(“Thread joined\n”); 
    sem_destroy(&bin_sem); 
    exit(EXIT_SUCCESS); 
} 
void *thread_function(void *arg) { 
    sem_wait(&bin_sem); 
    while(strncmp(“end”, work_area, 3) != 0) { 
     printf(“You input %d characters\n”, strlen(work_area) -1); 
     sem_wait(&bin_sem);} 
    pthread_exit(NULL); 
} 

В приведенной выше программе, когда семафор освобождается с помощью sem_post(), при этом это возможно, что fgets и функция подсчета в thread_function выполнить одновременно .И я думаю, что эта программа не в разрешении второй нить , чтобы подсчитать символы до основного потока, снова читает клавиатуру. Правильно ли это?Многопоточность Семафор

+0

точный дубликат: http://stackoverflow.com/questions/681937/question-about-semaphore –

ответ

1

Второй поток будет читать символы только после возвращения sem_wait, сигнализируя, что sem_post был вызван где-то, поэтому я думаю, что все в порядке.

Что касается fgets и функции подсчета, эти два могут работать одновременно.

Я бы рекомендовал блокировку мьютекса в переменной work_area в этом случае, потому что если пользователь редактирует переменную в одном потоке, пока она читается в другом потоке, проблемы будут возникать.

Вы можете либо использовать семафор, или вы можете использовать семафор и установить начальное количество на нем 1.

При реализации семафора или использовать семафор, как, что, хотя, убедитесь, что поставить mutex_lock после sema_wait, иначе может возникнуть взаимоблокировка.

0

В этом примере вы хотите иметь мьютекс вокруг прочитанных & записей общей памяти.

Я знаю, что это пример, но следующий код:

fgets(work_area, WORK_SIZE, stdin); 

должны быть действительно:

fgets(work_area, sizeof(work_area), stdin); 

Если изменить размер work_area в будущем (в какой-либо другой постоянной, и т. д.), вполне вероятно, что изменение этой второй WORK_SIZE может быть пропущено.

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