13. Betriebssystem - Posix-Semaphor (unbenannter Semaphor)

Inhaltsverzeichnis

1. Einführung in unbenannte Semaphoren

Zweitens die Verwendung von Semaphorschritten

 Drei, sem_init, sem_destroy

4. Der Unterschied zwischen System-V-Semaphor und POSIX-Semaphor (named-sem und unnamed-sem)

5. Code

1. Einführung in unbenannte Semaphoren

Da die Threads des berühmten Semaphors einen Speicherplatz gemeinsam nutzen, ist es zur Lösung des gegenseitigen Synchronisationsausschlusses zwischen den Threads innerhalb des Prozesses notwendig, ein leichteres, speicherbasiertes (nicht innerhalb eines Dateisystems) unbenanntes Semaphor zu verwenden.

Zweitens die Verwendung von Semaphorschritten

1. Definieren Sie diese Variable (z. B. eine globale Variable) in einem Bereich, auf den diese Threads zugreifen können, und der Typ ist sem_t.

2. Bevor ein Thread es verwendet, initialisieren Sie es mit sem_init( ).

3. Verwenden Sie sem_wait( )/sem_trywait( ) und sem_post( ), um P- bzw. V-Operationen auszuführen.

4. Wenn er nicht mehr benötigt wird, verwenden Sie sem_destroy( ), um ihn zu zerstören

 Drei, sem_init, sem_destroy

 Unbenannte Semaphore werden im Allgemeinen zwischen Threads in einem Prozess verwendet, sodass der pshared-Parameter im Allgemeinen 0 ist. Wenn ein solches Semaphor zwischen Prozessen verwendet wird, muss es an einer Stelle definiert werden, auf die von jedem Prozess zugegriffen werden kann – beispielsweise in einem gemeinsam genutzten Speicher

4. Der Unterschied zwischen System-V-Semaphor und POSIX-Semaphor (named-sem und unnamed-sem)

1. Das Sys-V-Semaphor ist relativ alt und seine Syntax ist schwierig. POSIX-Semaphore sind einfach und leichtgewichtig.

2. Das sys-V-Semaphor kann atomare P/V-Operationen an mehreren Semaphor-Elementen ausführen, die mehrere Ressourcen gleichzeitig darstellen, und das POSIX-Semaphor kann nur jeweils ein Semaphor ausführen.

3. Die sys-V-Semaphore und named-sem sind systemweite Ressourcen, die nach dem Verschwinden des Prozesses weiter existieren, während unnamed-sem eine prozessweite Ressource ist, die mit dem Beenden des Prozesses verschwindet.

4. Die P/V-Operation des sys-V-Semaphors kann einen Wert größer als 1 zum Semaphor-Element addieren oder subtrahieren, während jede P/V-Operation des POSIX-Semaphors 1 addiert oder subtrahiert

5. Das Sys-V-Semaphor unterstützt sogar Undo-Operationen – wenn ein Prozess eine P/V-Operation auf einem Sys-V-Semaphor durchführt, kann es die Operation kennzeichnen, die rückgängig gemacht werden muss, und wenn der Prozess beendet wird, wird das System automatisch rückgängig gemacht die Der Vorgang des Markierens ist erledigt. POSIX-Signale haben diese Fähigkeit nicht.

6. Sys-V-Semaphor und Named-Sem eignen sich zum Synchronisieren des gegenseitigen Ausschlusses zwischen Prozessen, während Unnamed-Sem zum Synchronisieren des gegenseitigen Ausschlusses zwischen Threads geeignet ist.

Im Allgemeinen ist die Semaphore von System-V leistungsfähig, so leistungsfähig, dass sie zu aufgebläht ist.Wenn Sie diese erweiterten Funktionen in der realen Arbeit nicht benötigen, wird empfohlen, die POSIX-Semaphore mit klarer Oberfläche und einfacher Logik zu verwenden.

5. Code

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

// 定义线程间共享的资源
sem_t sem ;

// 定义一个指针作用与线程之间的共享内存
char  * mem_map = NULL ;

void * FUNCTION(void * arg)
{
    // 由于接收到的arg 是 void 型的, 因此先进行强转
    char * msg = (char *)arg ;
    
    printf("线程号:%ld , 收到参数为:%s \n" , pthread_self() , msg );

    while(1)
    {   
        sem_wait(&sem) ;  
        printf("msg : %s \n" , mem_map) ;  
        sem_post(&sem);
        usleep(1000);//要有延时
    }
}

int main(int argc, char const *argv[])
{
    // 划分一个用于线程间通信的共享内存
    mem_map = calloc(1, 32) ;//申请一片32字节的内存


    //  初始化无名信号量信号量  0 表示线程间, 1 表示初始化资源量为1 
    if(sem_init( &sem , 0 , 1 ))
    {
        perror("sem init error");
        return -1 ;
    }
    
    // 创建线程
    pthread_t  thread;
    pthread_create(&thread, NULL, FUNCTION , "Hello GZ2123");

    while(1)
    {
        // P 操作, 等待获取资源
        sem_wait(&sem) ;
                
        fgets(mem_map , 32 , stdin) ;//获取数据
                
        sem_post(&sem);//释放资源
        usleep(1000);
    }
    return 0;
}

 

Je suppose que tu aimes

Origine blog.csdn.net/weixin_45981798/article/details/129881950
conseillé
Classement