IPC: 同步

###################################################

进程/线程 同步.(posix)

互斥锁

条件变量

读写锁

记录上锁

-----------------------------------------------------------

互斥锁:

用于上锁和解锁。保护代码临界区,保证任何时刻只有一个线程在临界区内执行。

gcc   -lpthread

#include <pthread.h>

建立互斥量:

int
pthread_mutex_init
(pthread_mutex_t *mutex, constpthread_mutexattr_t *mutexattr);

如果是静态分配的可以直接赋值为PTHREAD_MUTEX_INITIALIZER使用默认属性,如果是动态分配的或者分配在共享内存区中,需要调用该函数初始化。

给互斥量加锁:

int
pthread_mutex_lock
(pthread_mutex_t *mutex);

如果这个线程被另外的互斥锁锁住,就阻塞。

int
pthread_mutex_trylock
(pthread_mutex_t*mutex);

非阻塞版本,不等待直接返回错误。

给互斥量解锁:

int
pthread_mutex_unlock
(pthread_mutex_t *mutex);

销毁互斥量:

int
pthread_mutex_destroy
(pthread_mutex_t *mutex);

---------------------------------------------------

条件变量

用于等待。

gcc  -lpthread

#include <pthread.h>

 

int pthread_cond_init(pthread_cond_t*cond, pthread_condattr_t *cond_attr);

如果是静态分配的可以直接赋值为PTHREAD_COND_INITIALIZER,使用默认属性。如果是动态分配的或者分配在共享内存区中,需要调用该函数初始化。

int pthread_cond_signal(pthread_cond_t*cond);

只唤醒等待在条件变量cond上的一个线程。

int pthread_cond_broadcast(pthread_cond_t*cond);

唤醒条件变量cond上的多个线程。

int pthread_cond_wait(pthread_cond_t*cond, pthread_mutex_t *mutex);

给互斥锁mutex解锁,把调用线程投入睡眠,直到另外某个线程就条件变量cond调用pthread_cond_signal函数;返回前重新给mutex上锁。

int pthread_cond_timedwait(pthread_cond_t*cond, pthread_mutex_t *mutex, const struct timespec *bastime);

指定了阻塞的时间。

int pthread_cond_destroy(pthread_cond_t*cond);

销毁条件变量。

---------------------------------------------------

读写锁:

将读和写分开,用于读叫共享锁,用于写叫独占锁。

#include <pthread.h>

int pthread_rwlock_init(pthread_rwlock_t*restrict rwlock, const pthread_rwlockattr_t *restrict attr);

如果是静态分配的可以直接赋值为PTHREAD_RWLOCK_INITIALIZER,使用默认属性。如果是动态分配的或者分配在共享内存区中,需要调用该函数初始化。

int pthread_rwlock_rdlock(pthread_rwlock_t*rwlock);

获取一个读锁,如果没有获取到就阻塞。

int pthread_rwlock_tryrdlock(pthread_rwlock_t*rwlock);

获取一个读锁,没有获取到就返回错误。

int pthread_rwlock_wrlock(pthread_rwlock_t*rwlock);

获取一个写锁,如果没有获取到就阻塞。

int pthread_rwlock_trywrlock(pthread_rwlock_t*rwlock);

获取一个写锁,没有获取到就返回错误。

int pthread_rwlock_unlock(pthread_rwlock_t*rwlock);

解除读写锁。

int pthread_rwlock_destroy(pthread_rwlock_t*rwlock);

销毁一个读写锁。

---------------------------------------------------

互斥锁、条件变量、读写锁 的属性

XXX:mutex、cond、rwlock

int pthread_XXXattr_getpshared(constpthread_XXXattr_t *attr, int *valptr);

返回当前的属性值到valptr。

int pthread_XXXattr_setpshared(pthread_XXXattr_t*attr, int value);

将value设置给当前属性。

value取值:

PTHREAD_PROCESS_PRIVATE:不在进程间共享

PTHREAD_PROCESS_SHARED:在进程间共享

int pthread_XXXattr_init(pthread_XXXattr_t*attr);

初始化设置的属性。

int pthread_XXXattr_destroy(pthread_XXXattr_t*attr);

销毁设置的属性。

-----------------------------------------------------------

posix记录上锁:

记录上锁用于进程之间共享某个文件的读与写。

记录上锁的posix接口是fcntl函数.

#include<unistd.h>

#include<fcntl.h>

int fcntl(int fildes, int cmd, …/*arg*/);

执行各种描述符控制操作。

用于记录上锁的cmd:

F_SETLK:  获取或释放锁,如果无法将该锁授予调用过程就返回错误。

F_SETLKW:   获取或释放锁,如果无法将该锁授予调用过程就阻塞。

F_GETLK:  检查是否有某个以存在的锁妨碍即将授予新锁,将该锁信息写入flock结构。

记录上锁要求第三个参数为下面结构:

struct flock

{

short   l_type;   //F_RDLCK, F_WRLCK, F_UNLCK

short   l_whence;   //SEEK_SET, SEEK_CUR, SEEK_END

off_t   l_start;   // 根据l_whence解释从哪里开始偏移

off_t   l_len;   // 0 就是从l_start到长度的最大可能值

pid_t   l_pid;  // F_GETLK返回的PID

}

锁住整个文件就是:

l_whence = SEEK_SET

l_start = 0

l_len = 0

对于一个打开的某个文件的给定进程,当关闭该文件的所有描述符或它本身终止,与该文件关联的所有锁都被删除。

锁不能通过fork由子进程继承。

时间: 2024-08-08 14:40:08

IPC: 同步的相关文章

Linux IPC 同步(三):记录锁

进程间的互斥,我们可以让这些进程共享某个内存区(mmap实现),然后在该共享内存区中使用某种类型的同步变量 但是,fcntl记录上锁往往更容易使用. #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd, ... /* struct flock *arg */ ); struct flock { ... short l_type; /* Type of lock: F_RDLCK, F_WRLCK, F_U

Linux IPC 同步(四):信号量

Posix  semaphore 有名信号量 /* sem_open - initialize and open a named semaphore */ #include <fcntl.h> /* For O_* constants */ #include <sys/stat.h> /* For mode constants */ #include <semaphore.h> sem_t *sem_open(const char *name, int oflag);

Linux IPC 同步(二):读写锁

读写锁的分配规则如下: 1.  只要没有线程持有某个指定的读写锁用于写,那么任意数目的线程可以持有该读写锁用于读: 2.  仅当没有线程持有某个指定的读写锁用于读或者用于写,才能分配读写锁用于写. 这样的访问方式也称为共享-独占上锁(shared-exclusion) 那么我想到了这样一个场景: 线程A要写数据,上锁未果被阻塞,期间不断有读者来读,线程A饿死......  (实验验证之) int pthread_rwlock_init(pthread_rwlock_t *, pthread_rw

[原创]chromium源码阅读-进程间通信IPC.消息的接收与应答

chromium源码阅读-进程间通信IPC.消息的接收与应答 chromium源码阅读-进程间通信IPC.消息的接收与应答 介绍 chromium进程间通信在win32下是通过命名管道的方式实现的,最后的数据都是以二进制流的方式进行传播,pickle类就是负责消息的封包与解包功能,它将各种数据已二进制的形式写到内存缓冲区中,在实际通信的时候通过与其他一些辅助类与模板函数来实现具体数据结构的写与读.本文主要介绍的是chromium在将消息发送与接收过程中,以及chromium如何通过各种消息宏与C

进程间同步---system v ipc 对象信号灯集

一.信号灯简介 Linux支持System V的信号灯(semaphore),是一种进程间通信的方式,只不过它和管道.FIFO或者共享内存不一样,信号灯主要用于同步或者互斥对共享资源的访问,它的发明来源于火车运行系统中的"信号灯",利用信号灯可以实现"PV"操作这种进程间同步进制.P操作时获得资源,将信号灯的值减1,如果结果不为负则执行完毕,进程获得资源,否则进程睡眠以等待的进程释放;V操作则是释放资源,给信号灯的值加1, 唤醒一个因执行P操作而等待的进程. 二.信

第15章 进程间通行 15.6 XSI IPC 15.7 消息队列

15.6 XSI IPC (1)3种称作XSI IPC的IPC是: 1)消息队列 2)信号量 3)共享存储器 (2)标识符和键 1)标识符:是一个非负整数,用于引用IPC结构.是IPC对象的内部名. 2)键:IPC对象的外部名.可使多个合作进程能够在同一IPC对象上汇聚. (3)IPC_PRIVATE键: 用于创建一个新的IPC结构.不能指定此键来引用一个现有的IPC结构. (4)ftok函数: 由一个路径名和项目ID产生一个键. (5)ipc_perm结构体 规定了ipc结构的权限和所有者.

进程间的通讯(IPC)方式

为什么要进行进程间的通讯(IPC (Inter-process communication)) 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到.通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程).资源共享:多个进程之间共享同样的资源.为了作到这一点,需要内核提供锁和同步机制.进程控制:有些进程希望完全控制另一个进程的执行

信号量学习 &amp; 共享内存同步

刚刚这篇文章学习了共享内存:http://www.cnblogs.com/charlesblc/p/6142139.html 里面也提到了共享内存,自己不进行同步,需要其他手段比如信号量来进行.那么现在就学习信号量咯. 共享内存实际编程中, 应该使用信号量, 或通过传递消息(使用管道或IPC消息), 或生成信号 的方法来提供读写之间的更有效的同步机制. 方法一.利用POSIX有名信号灯实现共享内存的同步 方法二.利用POSIX无名信号灯实现共享内存的同步 方法三.利用System V的信号灯实现

Linux系统开发9 线程同步

[本文谢绝转载原文来自http://990487026.blog.51cto.com] <大纲> Linux系统编程8 线程同步 多线程共享资源,不加锁,同步互斥演示 多线程共享资源,加锁,同步互斥演示 读写锁:3个写线程,5个读线程,不加锁,并行处理 读写锁:3个写线程,5个读线程,加读写锁,串行处理 条件变量:生产消费者模型 信号量 进程间锁 文件锁: 习题 死锁,哲学家就餐 多线程共享资源,不加锁,同步互斥演示 [email protected]:~/linux_c/thread$ ca