进程信号量和线程信号量

信号灯/信号量 (semephore)

    三种

        1、posix 有名信号灯 

        2、posix 基于内存的信号灯(无名信号灯 )  //这个是线程用的信号量  因为无名管道就是在父子线程之间的 它也一样

        3、System V信号灯(IPC对象)

进程间使用的信号灯:  1、posix 有名信号灯  使用频率不高,不做介绍

                                    2、System V信号灯    它是一个集合一个或者多个信号灯的集合    它用于进程之间的同步控制 

                        利用PV原语进行操作 它的函数有 : 

                     创建信号灯:

                            int(key_t key,int nsems,int semflg);

               参数:key  ftok()函数得到    int nsems  有几个信号灯     semflg   权限  例如:  IPC_CREAT  | 0644

                     操作信号灯:

                            int (int semid,struct sembuf *opsptr,size_t nops);

                             参数:semid   semget()的返回值

                                        struct sembuf {

                                                         unsigned short sem_num;  /* semaphore number */ 编号
                                                           short          sem_op;   /* semaphore operation */ p操作和V操作
                                                           short          sem_flg;  /* operation flags */一般给0

                                                    };

                                          nops  要操作的信号灯的个数

                    对信号灯的控制

                            int semctl(int semid,int semnum,int cmd,/*union semun arg*/);

                        参数: semid  semget返回值

                                         semnum 控制几个信号灯

                                        cmd  IPC_RMID 删除信号灯集  SETVAL设置信号灯的值  GETVAL 获取信号灯的值

                                        union semun arg    //<linux/sem.h>中有定义

                         
                                           union semun {
                                                                           int              val;    /* Value for SETVAL */
                                                                           struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
                                                                              unsigned short  *array;  /* Array for GETALL, SETALL */

                                                                           struct seminfo  *__buf;  /* Buffer for IPC_INFO 

                                                                                (Linux-specific) */

                                                                         };

    线程信号量(posix)
                        

           初始化sem                           

          int sem_init(sem_t *sem,int pshared,unsigned int value);

            P操作

            int sem_wait(sem_t * sem);   //阻塞

             int sem_trywait(sem_t * sem);    //非阻塞

            V操作

             int sem_post(sem_t * sem); 

            销毁sem

               int sem_destroy(sem_t *sem);

            

猜你喜欢

转载自blog.csdn.net/nbdr_yl/article/details/80668259