同步(synchronization)指的是多个任务(线程)按照约定的顺序相互配合完成一件事情。由于多
个进程共享一段内存,因此也需要依靠某种同步机制,如互斥锁和信号量等 。
信号量(semaphore),它是不同进程间或一个给定进程内部不同线程间同步的机制。信号量包
括:posix有名信号量、 posix基于内存的信号量(无名信号量) 和 System V信号量(IPC对象)。
【文章福利】小编推荐自己的Linux内核源码交流群:【869634926】整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!Linux内核课程示例:
方法一:利用POSIX有名信号量实现共享内存的同步
有名信号量既可用于线程间的同步,又可用于进程间的同步。
两个进程,对同一个共享内存读写,可利用有名信号量来进行同步。一个进程写,另一个进
程读,利用两个有名信号量“semr”, “semw”。semr信号量控制能否读,初始化为0。 semw信号量
控制能否写,初始为1。
以下这两段代码中,读程序刚开始会一直阻塞到写程序往内存中写入数据后,给读信号量
“semr”加1后才会继续运行。而写程序,由于刚开始的写信号量初始化为1,此时写信号量“semw”
在执行“sem_wait”后会减1。因此会直接执行写操作后,给读信号量“semr”加1,出发读程序继续往
下进行。
读共享内存的程序示例代码如下:
// 创建一个名为"mysem_r"的读信号量(有名信号量)
semr = sem_open("mysem_r", O_CREAT | O_RDWR , 0666, 0);
if (semr == SEM_FAILED)
{
printf("errno=%d\n", errno);
return -1;
}
// 创建一个名为"mysem_w"的写信号量(有名信号量)
semw = sem_open("mysem_w", O_CREAT | O_RDWR, 0666, 1);
if (semw == SEM_FAILED)
{
printf("errno=%d\n", errno);
return -1;
}
// 创建共享内存区域
if ((shmid = s