2009-03-25 7 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); 
} 

Im Programm oben, wenn die Semaphore sem_post() freigegeben wird, ist es möglich, dass die fgets und die Zählfunktion in thread_function gleichzeitig ausführen .Und ich denke, dass dieses Programm nicht die zweite in ermöglicht Thread , um die Zeichen zu zählen, bevor der Haupt-Thread die Tastatur erneut liest. Ist das richtig?Multithreading Semaphore

+0

genaue Kopie von: http://StackOverflow.com/Questions/681937/Question-about-Semaphore –

Antwort

1

Der zweite Thread liest nur Zeichen, nachdem sem_wait zurückgegeben wurde, was bedeutet, dass ein sem_post irgendwo aufgerufen wurde, also denke ich, dass das in Ordnung ist.

Wie für Fgets und die Zählfunktion könnten diese zwei gleichzeitig ausgeführt werden.

Ich würde in diesem Fall eine Mutexsperre für die Variable "work_area" empfehlen, denn wenn der Benutzer die Variable in einem Thread bearbeitet, während er in einem anderen Thread gelesen wird, treten Probleme auf.

Sie können entweder einen Mutex verwenden, oder Sie können eine Semaphore verwenden und stellen Sie die anfängliche Anzahl darauf 1.

Wenn Sie einen Mutex implementieren oder eine Semaphore so verwenden aber stellen Sie sicher, die mutex_lock zu setzen, nachdem sema_wait, andernfalls kann ein Deadlock auftreten.

0

In diesem Beispiel möchten Sie einen Mutex um die gelesenen & Schreibvorgänge des gemeinsamen Speichers haben.

Ich weiß, das ist ein Beispiel, aber der folgende Code:

fgets(work_area, WORK_SIZE, stdin); 

sein sollte wirklich:

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

Wenn Sie die Größe von work_area in der Zukunft (zu einer anderen Konstante ändern, usw.), ist es sehr wahrscheinlich, dass das Ändern dieser zweiten WORK_SIZE verpasst werden könnte.