sem

线程3——信号量

霸气de小男生 提交于 2019-12-01 08:51:01
创建信号量,并赋予初值 int sem_init(sem_t *sem, int pshared, unsigned int value); 销毁信号量 int sem_destroy(sem_t *sem); 阻塞,信号量数值-1 int sem_wait(sem_t *sem); 非阻塞申请 int sem_trywait(sem_t *sem); 计时申请一个信号量 int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout); 发送信号量,数值 +1 int sem_post(sem_t *sem); 获取信号量值 int sem_getvalue(sem_t *sem, int *sval); 示例:和互斥锁案例相同 1 #include <stdio.h> 2 #include <unistd.h> 3 #include <stdlib.h> 4 #include <semaphore.h> 5 6 7 void* task1(void *arg); 8 void* task2(void *arg); 9 void* task3(void *arg); 10 11 static int i = 10 ; 12 static sem_t sem; //信号量指针 13 14 15 int main

System V信号量

柔情痞子 提交于 2019-11-29 22:25:36
目录 1. System V IPC 概述 IPC键和ftok函数 ipc_perm结构 创建与打开IPC对象 ipcs和ipcrm命令 2. System V信号量 计数信号量集 semget semop semctl 3. 测试程序 代码实现 semcreate.c semrmid.c semsetvalues.c semgetvalues.c semops.c 运行测试 1. System V IPC 概述 以下三种类型的IPC合称为System V IPC: System V信号量 System V消息队列 System V共享内存 System V IPC在访问它们的函数和内核为它们维护的信息上有一些类似点,主要包括: IPC键和ftok函数 ipc_perm结构 创建或打开时指定的用户访问权限 ipcs和ipcrm命令 下表汇总了所有System V IPC函数。 信号量 消息队列 共享内存 头文件 sys/sem.h sys/msg.h sys/shm.h 创建或打开IPC的函数 semget msgget shmget 控制IPC操作的函数 semctl msgctl shmctl IPC操作函数 semop msgsnd msgrcv shmat shmdt IPC键和ftok函数 三种类型的System V IPC都使用IPC键作为它们的标识

Posix信号量

孤街浪徒 提交于 2019-11-29 15:39:37
目录 1. Posix IPC 概述 IPC名字 创建与打开IPC 读写权限与创建标志 用户访问权限 IPC对象的持续性 2. 信号量概述 信号量定义及分类 信号量操作 信号量、互斥锁和条件变量的差异 3. Posix有名信号量 创建和打开 关闭和删除 等待和挂出 获取信号量的值 4. Posix无名信号量 5. Posix信号量限制 1. Posix IPC 概述 以下三种类型的IPC合称为Posix IPC: Posix信号量 Posix消息队列 Posix共享内存 Posix IPC在访问它们的函数和描述它们的信息上有一些类似点,主要包括: IPC名字 创建或打开时指定的读写权限、创建标志以及用户访问权限 下表汇总了所有Posix IPC函数。 信号量 消息队列 共享内存 头文件 semaphore.h mqueue.h sys/mman.h 创建、打开或删除IPC的函数 sem_open sem_close sem_unlink sem_init sem_destroy mq_open mq_close mq_unlink shm_open shm_unlink 控制IPC操作的函数 mq_getattr mq_setattr ftruncate fstat IPC操作函数 sem_wait sem_trywait sem_post sem_getvalue mq_send

Linux线程间同步的几种方式

删除回忆录丶 提交于 2019-11-29 02:43:27
信号量 信号量强调的是线程(或进程)间的同步:“信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在sem_wait的时候,就阻塞在那里)。当信号量为单值信号量时,也可以完成一个资源的互斥访问。信号量测重于访问者对资源的有序访问,在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。 有名信号量 可以用于不同进程间或多线程间的互斥与同步 创建打开有名信号量 sem_t *sem_open(const char *name, int oflag); sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value); //成功返回信号量指针;失败返回SEM_FAILED,设置errno name是文件路径名,但不能写成/tmp/a.sem这样的形式,因为在linux下,sem都是在/dev/shm目录下,可写成"/mysem"或"mysem",创建出来的文件都是"/dev/shm/sem.mysem",mode设置为0666,value设置为信号量的初始值.所需信号灯等已存在条件下指定O_CREAT|O_EXCL却是个错误。 关闭信号量,进程终止时,会调用它 int sem

信号量整理

无人久伴 提交于 2019-11-29 01:42:16
信号量 一、 1、 信号量的数据类型为结构 sem_t,它本质上是一个长整型的数。 2 、例如: typedef struct { struct _pthread_fastlock __sem_lock; int __sem_value; _pthread_descr __sem_waiting; } sem_t; 3、sem_t分为有名和无名。有名的sem_t通过sem_open来创建 用于进程通信; 而无名的 sem_t通过sem_init的初始化 是基于内存的信号量 。 4、 有名和无名的 sem_t主要区别: ( 1) 效率:有名 sem_t是放在文件,无名的sem_t是放在内存。 ( 2) 限制:有名的 sem_t可以用来同步多线程,任意多进程。而无名的sem_t可以用来同步多线程,以及Fork出来的进程间的同步。 (如果没有放到共享内存,就算将 pshared设置为1,也起不了作用。 ) ( 3)pshared传递一个非零将会使函数调用失败,属于无名信号量。 二、 1、sem_init: 用来初始化一个信号量。 1、int sem_init(sem_t *sem, int pshared, unsigned int value); ( 1)sem_init函数是Posix信号量操作中的函数, 作用是对由 sem指定的信号量进行初始化。sem_init()

线程

人走茶凉 提交于 2019-11-28 21:54:44
线程 文章目录 线程 1 概述 1.1 线程机制分类和特性 1.2 线程标识 2 线程编程 2.1 线程基本编程 3 线程间的同步与互斥 3.1 互斥锁线程控制 3.2 信号量线程控制 4 线程属性 4.1 概述 4.2 函数 5 生产者消费者实验 5.1 概述 5.2 解决方案 5 生产者消费者实验 5.1 概述 5.2 解决方案 1 概述 线程进程内独立的一条运行路线,处理器调度的小单元,也可以称为轻量级进程。线程可以对进程的内存空间和资 源进行访问,并与同一进程中的其他线程共享。 典型进程只有一个控制线程,有多个控制线程后,进程在某一时刻能做不止一件事。 为每种事件类型分配单独的处理线程,可简化处理异步事件的代码。 多个线程可自动访问相同的存储地址空间和文件描述符。一个进程的所有信息对进程的所有线程共享。 分解问题从而提高程序吞吐量,单线程进程完成多任务需把任务串行化,而多线程中相互独立的处理可以交叉进行。 使用多线程可改善响应时间。 注 :多线程程序在单处理器上运行也能改善响应时间和吞吐量。 1.1 线程机制分类和特性 用户级线程 :用户级线程主要解决的是上下文切换的问题,它的调度算法和调度过程全部由用户自行选择决定。如果一个进程中的某一个线程调用了一个阻塞 的系统调用函数,那么该进程包括该进程中的其他所有线程也同时被阻塞。主要缺点是无法发挥多处理器的优势。 轻量级线程

python3 multiprocessing Semaphore

烈酒焚心 提交于 2019-11-28 18:48:19
http://mirror.hust.edu.cn/gnu/glibc/ glibc-2.29.tar.gz glibc: bits/semaphore.h #if __WORDSIZE == 64 # define __SIZEOF_SEM_T 32 #else # define __SIZEOF_SEM_T 16 #endif /* Value returned if `sem_open' failed. */ #define SEM_FAILED ((sem_t *) 0) typedef union { char __size[__SIZEOF_SEM_T]; long int __align; } sem_t; PyModule_AddObject(module, "SemLock", (PyObject*)&_PyMp_SemLockType); Python-3.6.8/Modules/_multiprocessing/multiprocessing.h typedef sem_t *SEM_HANDLE; Python-3.6.8/Modules/_multiprocessing/semaphore.c enum { RECURSIVE_MUTEX, SEMAPHORE }; typedef struct { PyObject_HEAD SEM_HANDLE

Linux c线程

非 Y 不嫁゛ 提交于 2019-11-28 07:21:00
1、pthread_create 2、pthread_join 3、sem_init sem_destroy 4、sem_post sem_wait 5、所有线程可以共同访问全局区 --------------------------------------------------------------------------------- 【1】程序:静态存储在磁盘上 进程:程序动态执行时 线程:可以将进程划分成多个子任务执行 【2】线程是依附于进程存在的 多个线程共同享有进程的内存空间 其中全局区可以被所有的线程访问 【3】线程的创建 int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); 功能:在当前进程(主线程)内开启一个新的线程(副线程)。 参数:thread:存储线程ID attr:NULL,默认的线程属性:8M的栈空间 start:传一个函数名,线程的执行体 arg:NULL 返回:成功返回0,失败非0 注意:编译时加 -pthread 【4】int pthread_join(pthread_t thread, void **retval); 功能:阻塞等待一个线程的退出,当该线程结束则唤醒等待 参数:thread

RTT-信号量随笔

谁说我不能喝 提交于 2019-11-27 07:05:02
信号量有点类似全局变量标志,但是应用有差别。 struct rt_semaphore sem_test; 初始化一个静态信号量 if(rt_sem_init(&sem_test,"test",0,RT_IPC_FLAG_FIFO)==RT_EOK) { UsartPrintf(USART1, "init sem_test is OK\r\n"); } else { UsartPrintf(USART1, "init sem_test is fail\r\n"); } 放一个信号量 rt_sem_release(&sem_test); 识别信号量 处理任务 if(rt_sem_trytake(&sem_test)==RT_EOK) { UsartPrintf(USART1, "get sem_test is ok\r\n"); } 来源: https://blog.csdn.net/u012210286/article/details/99538885

System V IPC 之信号量

流过昼夜 提交于 2019-11-27 00:39:13
本文继《 System V IPC 之共享内存 》之后接着介绍 System V IPC 的信号量编程。在开始正式的内容前让我们先概要的了解一下 Linux 中信号量的分类。 信号量的分类 在学习 IPC 信号量之前,让我们先来了解一下 Linux 提供两类信号量: 内核信号量,由内核控制路径使用。 用户态进程使用的信号量,这种信号量又分为 POSIX 信号量和 System V 信号量。 POSIX 信号量与 System V 信号量的区别如下: 对 POSIX 来说,信号量是个非负整数,常用于线程间同步。而 System V 信号量则是一个或多个信号量的集合,它对应的是一个信号量结构体,这个结构体是为 System V IPC 服务的,信号量只不过是它的一部分,常用于进程间同步。 POSIX 信号量的引用头文件是 "<semaphore.h>",而 System V 信号量的引用头文件是 "<sys/sem.h>"。 从使用的角度,System V 信号量的使用比较复杂,而 POSIX 信号量使用起来相对简单。 本文介绍 System V 信号量编程的基本内容。 System V IPC 信号量 信号量是一种用于对多个进程访问共享资源进行控制的机制。共享资源通常可以分为两大类: 互斥共享资源,即任一时刻只允许一个进程访问该资源 同步共享资源,即同一时刻允许多个进程访问该资源