スレッド セーフ ----POSIX セマフォ

    POSIXセマフォは、 POSIX名前なしセマフォとPOSIX名前付きセマフォ の 2 つのタイプに分けられます。 これら 2 つのセマフォは、前に紹介したセマフォ メカニズムが古いため、古いシステムです)、しかしPOSIX の優れた設計により、それらはより魅力的になります

POSIX名前付きセマフォ 

       この種の名前付きセマフォの名前は、「/somename」のような文字列で構成されます。前にスラッシュがあることに注意してください。このようなセマフォは実際には特別なファイルです。正常に作成されると、特別なファイルに配置されます。仮想ファイル システム /dev/shm では 、異なるプロセスが同じ名前に同意する限り、この名前付きセマフォを通じて相互に調整できます。

      POSIX名前付きセマフォを使用する一般的な手順は次のとおりです。

       1. sem_open() を使用して 、名前付きセマフォを作成または開きます。
       2. sem_wait()sem_post() を使用して、 それぞれP操作とV操作を実行します
       3. sem_close()を 使用して 閉じます。
       4. sem_unlink() を 使用して 削除し、システム リソースを解放します。
#include<stdio.h>
#include <sys/types.h> 
#include <sys/shm.h>
 #include <sys/ipc.h> 
 #include <sys/sem.h>
 #include <unistd.h>
 #include <stdlib.h>
#include <fcntl.h> 
#include <sys/stat.h> 
#include <semaphore.h>
char * shm_init()
{
    //获取KEY值
     int key=ftok("./",'X');
    
     int shm_id=shmget(key, 4096,IPC_CREAT|0666);
     if(shm_id==-1)
     {
        perror("shmget id erorr");
        exit(1);//直接结束进程
     }
    //映射共享内存
    char *shm_map=shmat(shm_id, NULL, 0);
    if(shm_map==(void *)-1)
    {
        perror("shm map error");
         exit(1);//直接结束进程
    }

    return shm_map;
    
}
int main(int argc, char const *argv[])
{

    //配置共享内存并初始化
     char *shm_map=shm_init();
     //初始化信号量int  sem_id=sem_nameinit();

    sem_t* fd_sem=sem_open("/my sem name", O_CREAT, 0644, 1);    // 创建一个新的有名信号量 初始化资源为0
    while (1)
   {
    //申请一个资源
     printf("等待申请资源中!!\n");
         sem_wait(fd_sem);
        printf("成功申请到资源!!\n请输入消息:");
      //写入信息到共享内存中
     fgets(shm_map,4096,stdin);
     
     sem_post(fd_sem);

   }
return 0;
}
  複数のリソース を適用または解放できる       system-V セマフォとは異なり、 POSIX セマフォの場合は、
1回あたりの申請および解放のリソース数は1です sem_wait() を呼び出すと、 リソースが 0 の ときにブロックが発生します。
ブロックして待機したくない場合は、代わりに sem_trywait() を使用できます。 

おすすめ

転載: blog.csdn.net/m0_52467164/article/details/127562779