pthread

Concurrency and Parallelism

﹥>﹥吖頭↗ 提交于 2019-11-30 12:21:18
0 Concurrency and Parallelism 当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。区别:并发和并行是即相似又有区别的两个概念,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。 1. 网络编程 1.1 TCP/IP网络编程 Client: socket connect write recv Server: socket bind listen accept read send An example: Simple TCP/IP C/S . a. socket #include <sys/socket.h> sockfd = socket(int socket_family, int socket_type, int protocol); b. connect #include <sys/types.h> #include <sys/socket.h> int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); c. bind #include <sys/types.h> #include <sys/socket.h> int bind

KVO 实践及 FBKVOController 原理

有些话、适合烂在心里 提交于 2019-11-30 12:20:53
本篇简单学习下如何使用 KVO KVO是什么? KVO 是 Object-C 中定义的一个通知机制,其定义了一种对象间监控对方状态的改变,并做出反应的机制。对象可以为自己的属性注册观察者,当这个属性的值发生了改变,系统会对这些注册的观察者做出通知。其用途十分广泛,比方说,你的下载进度条是根据下载百分比决定的,那么,可以通过观察下载百分比的改变,刷新进度条的样式,来直观的反应下载进度等等。 KVO的用法 为对象的属性注册观察者 1234 - (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context observer: 观察者对象. 其必须实现方法 observeValueForKeyPath:ofObject:change:context: . keyPath: 被观察的属性,其不能为 nil . options: 设定通知观察者时传递的属性值,是传改变前的呢,还是改变后的,通常设置为 NSKeyValueObservingOptionNew 。 context: 一些其他的需要传递给观察者的上下文信息,通常设置为 nil 。 观察者接收通知 1234 - (void

基于MysqlConnector/C++的数据库连接池的实现

筅森魡賤 提交于 2019-11-30 12:18:09
1. 连接池的介绍: 1.1 应用背景: 一般的应用 程序 都会访问到数据库,在程序访问数据库的时候,每一次数据访问请求都必须经过 下面几个步骤: 建立数据库连接,打开数据库,对数据库中的数据进行操作,关闭数据库连接。而建立数据库连接和打开数据库是一件很消耗资源并且费时的工作,如果在系统中很频繁的发生这种数据库连接,必然会影响到系统的性能,甚至会导致系统的崩溃。 1.2 技术思想: 在 系统 初始化阶段,建立一定数量的数据库连接对象 ( C onnection) ,并将其存储在连接池 中定义的 容器中。当有数据库访问请求时,就从连接池中的这个容器中拿出一个连接;当容器中的连接已经用完,并且还没有达到系统定义的最大连接数时,可以再创建一个新的连接 , 当当前使用的连接数达到最大连接数时,就要等待其他访问请求将连接放回容器后才能使用。当使用完连接的时候, 必须 将连接放回容器中,这样不同的数据库访问请求就可以共享这些连接,通过 重复使用 这些已经建立的数据库连接,可以解决上节中说到的频繁 建立连接 的缺点,从而提高了系统的性能。 经过上述描述,我们可以归纳出数据库连接池的主要操作: (1) 首先建立一个数据库连接池对象 (2) 初始化 一定数量的数据库连接,放入连接池对象的容器中 (3) 当有数据库访问请求时,直接从连接池的容器中得到一个连接,这里出现三种情况: (a)

pthread_cond_wait

大城市里の小女人 提交于 2019-11-30 02:21:48
while(1) 33 { 34 mm* p = NULL; 35 pthread_mutex_lock(&mutex); 36 while(head == NULL) 37    pthread_cond_wait(&cond, &mutex); 38 p = head->next; 39 printf("consumer %ld expense %d\n",pthread_self(), head->num); 40 free(head); 41 head = p; 42 pthread_mutex_unlock(&mutex); 43 } 这里 调用pthread_cond_wait等待条件的发生时,mutex会被 自动 释放。而且 pthread_cond_wait中的两个步骤必须是原子性的; 把调用线程放到条件等待队列上 释放mutex 调用这个函数进行等待条件的发生时,mutex会被自动释放 signal到底是放在unlock之前还是之后?? void enqueue_msg( struct msg *mp) { pthread_mutex_lock(&qlock); mp->m_next = workq; workq = mp; pthread_cond_signal(&qready); pthread_mutex_unlock(&qlock); }

Posix消息队列

可紊 提交于 2019-11-29 19:35:27
目录 1. 概述 2. Posix消息队列 创建与打开 关闭与删除 消息队列属性 获取属性 设置属性 消息发送与接收 3. 消息队列限制 4. 生产者消费者问题——Posix消息队列实现 单生产者 + 单消费者 多生产者 + 单消费者 5. 效率对比 1. 概述 消息队列可认为是一个消息链表,队列中的每个消息具有如下属性: 消息优先级,由发送者赋予 消息数据长度,可以为0 消息数据(如果消息数据长度大于0) Posix消息队列主要用于线程间消息的传递: A线程向队列中放置消息,B线程从队列中取出消息 A线程向队列写入消息之前,不需要B线程在该队列上等待消息的到达 A线程向队列写入消息之后,B线程可以在之后的某个时刻取出消息 A线程只关心向队列放入消息,B线程只关心从队列取出消息,A、B两个线程相互独立、互不影响 2. Posix消息队列 创建与打开 mq_open 用于创建一个新的消息队列或打开一个已存在的消息队列, 编译时需指定链接-lrt, 下面其他函数同理。 //成功返回消息队列描述符,失败返回-1 mqd_t mq_open(const char *name, int oflag, ... /* mode_t mode, struct mq_attr *attr */); 当创建一个新的消息队列时, attr参数用于给新队列指定某些属性, 若attr为NULL

线程编程 pthread 问题集合

淺唱寂寞╮ 提交于 2019-11-29 16:56:16
1 undefined reference to `pthread_create' 由于pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 libpthread.a,所以在使用pthread_create()创建线程,以及调用 pthread_atfork()函数建立fork处理程序时,在编译中要加 -lpthread参数 。 例如:在加了头文件#include <pthread.h>之后执行 pthread.c文件,需要使用如下命令: gcc thread.c -o thread -lpthread 这种情况类似于<math.h>的使用,需在 编译时加 -m 参数。 pthread_create()和pthread_atfork()函数使用时应注意的问题: #include <pthread.h> void pmsg(void* p) { char *msg; msg = (char*)p; printf("%s ", msg); } int main(int argc, char *argv) { pthread_t t1, t2; pthread_attr_t a1, a2; char *msg1 = "Hello"; char *msg2 = "World"; pthread_attr_init(&a1); pthread_attr_init(&a2);

生产者-消费者问题

烂漫一生 提交于 2019-11-29 16:28:12
目录 1. 概述 定义 缓冲区 2. 典型模型 模型一 模型二 可选需求 3. 数据结构队列C语言实现 4. 代码实现——互斥锁 + 条件变量 5. 代码实现——互斥锁 + Posix有名信号量 6. 代码实现——互斥锁 + Posix无名信号量 7. 效率对比 结论 奇怪的问题 1. 概述 定义 生产者消费者问题是线程同步的经典问题,也称为有界缓冲区问题,问题描述大致如下: 生产者和消费者之间共享一个有界数据缓冲区 一个或多个生产者(线程或进程)向缓冲区放置数据 一个或多个消费者(线程或进程)从缓冲区取出数据 缓冲区 生产者消费者问题中的缓冲区,包括队列缓冲区和环形缓冲区,它们都按照先进先出的顺序处理数据,我们现在只考虑队列缓冲区: 队列缓冲区通常使用普通的队列数据结构 队列内部实现可以是链表或数组 缓冲区有两个极端状态:缓冲区空,缓冲区满。链表队列和数组队列缓冲区空的含义相同,都是队列中没有一个元素的情形,但两者缓冲区满的含义不同: 数组队列在初始化时就必须指定最大容量,缓冲区满的条件很清晰 链表队列没有最大容量的概念,需要人为指定 此外,Posix消息队列也可以作为队列缓冲区,Posix当以无优先级消息的方式使用时,也是按照先进先出的顺序进行处理的。 本文只讨论第一种数据结构队列缓冲区,基于Posix消息队列缓冲区的生产者消费者问题,会在后续Posix消息队列中单独讲解。 2

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

pthread_mutex_lock引起的core

一世执手 提交于 2019-11-29 13:50:24
遇到一个奇怪的core core在pthread_mutex_lock下一行 最后发现: 某个线程pthread_mutex_lock的时候,另一个线程已经pthread_mutex_destroy掉这个锁 转载于:https://my.oschina.net/zipu888/blog/549563 来源: https://blog.csdn.net/chushang0934/article/details/100825836

线程同步

牧云@^-^@ 提交于 2019-11-29 13:48:59
目录 1. 线程同步概述 线程同步定义 线程同步方法 2. 互斥锁 互斥锁概念 互斥锁基本API 初始化与销毁 上锁与解锁 两个特殊的上锁函数 示例代码 3. 避免死锁 线程的死锁概念 产生死锁的四个必要条件 如何避免死锁 4. 条件变量 条件变量概念 条件变量基本API 初始化与销毁 等待条件满足 给线程发信号 示例代码 1. 线程同步概述 线程同步定义 线程同步,指的是 控制多线程间的相对执行顺序 ,从而在线程间 正确、有序地共享数据 ,以下为线程同步常见使用场合。 多线程执行的任务在顺序上存在依赖关系 线程间共享数据只能同时被一个线程使用 线程同步方法 在实际项目中,经常使用的线程同步方法主要分为三种: 互斥锁 条件变量 Posix信号量(包括有名信号量和无名信号量) 本节内容只介绍互斥锁和条件变量,Posix信号量后续在Posix IPC专题中介绍。 2. 互斥锁 互斥锁概念 互斥锁用于确保同一时间只有一个线程访问共享数据,使用方法为: 加锁 访问共享数据 解锁 对互斥锁加锁后,任何其他试图再次对其加锁的线程都会被阻塞,直到当前线程释放该互斥锁,解锁时所有阻塞线程都会变成可运行状态,但究竟哪个先运行,这一点是不确定的。 互斥锁基本API 初始化与销毁 互斥锁是用 pthread_mutex_t 数据类型表示的,在使用互斥锁之前,需要先进行初始化,初始化方法有两种: