APUE学习之多线程编程(二):线程同步
#include <pthread.h> int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr); int pthread_mutex_destroy(pthread_mutex_t *mutex);
#include <pthread.h> int pthread_mutex_lock(pthread_mutex_t *mutex); int pthread_mutex_unlock(pthread_mutex_t *mutex); int pthread_mutex_trylock(pthread_mutex_t *mutex);
![](/assets/blank.gif)
![](/assets/blank.gif)
#include <stdio.h> #include <pthread.h>struct foo {int f_count;pthread_mutex_t f_lock;int f_id; };struct foo * foo_alloc(int id) {struct foo *fp = NULL;if ((fp = malloc(sizeof(struct foo))) != NULL){fp->f_count = 1;fp->f_id = id;if (pthread_mutex_init(&fp->f_lock, NULL) != 0){free(fp);return NULL;}}return fp; }void foo_hold(struct foo *fp) {pthread_mutex_lock(&fp->f_lock);fp->f_count++;pthread_mutex_unlock(&fp->f_lock); }void foo_rele(struct foo *fp) {pthread_mutex_lock(&fp->f_lock);if (--fp->f_count == 0){pthread_mutex_unlock(&fp->f_lock);pthread_mutex_destroy(&fp->f_lock);free(fp);}else{pthread_mutex_unlock(&fp->f_lock);} }
View Code
![](/assets/blank.gif)
![](/assets/blank.gif)
#include "apue.h" #include <pthread.h>#define NMASH 29 #define HASH(id) (((unsigned long)id) % NMASH)struct foo *fh[NMASH];pthread_mutex_t hashlock = PTHREAD_MUTEX_INITIALIZER;struct foo {int f_count;pthread_mutex_t f_lock;int f_id;struct foo *f_next; };struct foo *foo_alloc(int id) {struct foo *fp = NULL;int idx = 0;if ((fp = malloc(sizeof(struct foo))) != NULL){fp->f_count = 1;fp->f_id = if;if (pthread_mutex_init(&fp->f_lock, NULL) != 0){free(fp);return NULL;}idx = HASH(id);pthread_mutex_lock(&hashlock);fp->f_next = fh[idx];fh[idx] = fp;pthread_mutex_lock(&fp->f_lock);pthread_mutex_unlock(&hashlock);pthread_mutex_unlock(&fp->f_lock);}return fp; }void foo_hold(struct foo *fp) {pthread_mutex_lock(&fp->f_lock);fp->f_count++;pthread_mutex_unlock(&fp->f_lock); }struct foo *foo_find(int id) {struct foo *fp = NULL;pthread_mutex_lock(&hashlock);for (fp = fh[HASH(id)]; fp != NULL; fp = fp->next){if (fp->f_id = id){foo_hold(fp);break;}}pthread_mutex_unlock(&hashlock);return fp; }void foo_rele(struct foo *fp) {struct foo *tfp = NULL;int idx = 0;pthread_mutex_lock(&fp->f_lock);if (fp->f_count == 1){pthread_mutex_unlock(&fp->f_lock);pthread_mutex_lock(&hashlock);pthread_mutex_lock(&fp->f_lock);if (fp->f_count != 1){fp->f_count--;pthread_mutex_unlock(&hashlock);pthread_mutex_unlock(&fp->f_lock);return;}idx = HASH(fp->f_id);tfp = fh[idx];if (tfp = fp){fh[idx] = fp->f_next}else{while(tfp->next != fp){tfp = tfp->next;}tfp->next = fp->f_next;}pthread_mutex_unlock(&hashlock);pthread_mutex_unlock(&fp->f_lock);pthread_mutex_destroy(&fp->f_lock);free(fp);}else{fp->f_count--;pthread_mutex_unlock(&fp->f_lock);} }
View Code
![](/assets/blank.gif)
![](/assets/blank.gif)
#include "apue.h" #include <pthread.h>#define NMASH 29 #define HASH(id) (((unsigned long)id) % NMASH)struct foo *fh[NMASH];pthread_mutex_t hashlock = PTHREAD_MUTEX_INITIALIZER;struct foo {int f_count;pthread_mutex_t f_lock;int f_id;struct foo *f_next; };struct foo *foo_alloc(int id) {struct foo *fp = NULL;int idx = 0;if ((fp = malloc(sizeof(struct foo))) != NULL){fp->f_count = 1;fp->f_id = if;if (pthread_mutex_init(&fp->f_lock, NULL) != 0){free(fp);return NULL;}idx = HASH(id);pthread_mutex_lock(&hashlock);fp->f_next = fh[idx];fh[idx] = fp;pthread_mutex_lock(&fp->f_lock);pthread_mutex_unlock(&hashlock);pthread_mutex_unlock(&fp->f_lock);}return fp; }void foo_hold(struct foo *fp) {pthread_mutex_lock(&hashlock);fp->f_count++;pthread_mutex_unlock(&hashlock); }struct foo *foo_find(int id) {struct foo *fp = NULL;pthread_mutex_lock(&hashlock);for (fp = fh[HASH(id)]; fp != NULL; fp = fp->next){if (fp->f_id = id){foo_hold(fp);break;}}pthread_mutex_unlock(&hashlock);return fp; }void foo_rele(struct foo *fp) {struct foo *tfp = NULL;int idx = 0;pthread_mutex_lock(&hashlock);if (fp->f_count == 1){idx = HASH(fp->f_id);tfp = fh[idx];if (tfp = fp){fh[idx] = fp->f_next}else{while(tfp->next != fp){tfp = tfp->next;}tfp->next = fp->f_next;}pthread_mutex_unlock(&hashlock);pthread_mutex_destroy(&fp->f_lock);free(fp);}else{fp->f_count--;pthread_mutex_unlock(&hashlock);} }
View Code
#include <pthread.h> #include <time.h> int pthread_mutex_timedlock(pthread_mutex_t *restrict mutex, const struct timespec *restrict tsptr);
#include <pthread.h> int pthread_rwlock_init(pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr); int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
#include <pthread.h> int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock); int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock); int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
![](/assets/blank.gif)
![](/assets/blank.gif)
#include <stdio.h> #include <pthread.h>struct job {struct job *j_next;struct job *j_prev;pthread_t j_id; };struct queue {struct job *q_head;struct job *q_tail;pthread_rwlock_t q_lock; };int queue_init(struct queue *qp) {int err;qp->q_head = NULL;qp->q_tail = NULL;err = pthread_rwlock_init(&qb->q_lock, NULL);if (err != 0){return err;}return 0 }void job_insert(struct queue *qp, struct job *jp) {pthread_rwlock_wrlock(&qb->q_lock);jp->next = qp->head;jp->j_prev = NULL;if (qp->q_head != NULL){qp->q_head->j_prev = jp;}else{qp->tail = jp;}qp->head = jp;pthread_rwlock_unlock(&qp->q_lock); }void job_append(struct queue *qp, struct job *jp) {pthread_rwlock_wrlock(&qp->q_lock);jp->j_next = NULL;jp->j_prev = qp->tail;if (qp->q_tail != NULL){qp->q_tail->j_next = jp;}qp->q_tail = jp;pthread_rwlock_unlock(&qp->q_lock); }void job_remove(struct queue *qp, struct job *jp) {pthread_rwlock_wrlock(&qp->q_lock);if (jp == qp->q_head){qp->q_head = jp->j_next;if (qp->q_tail == jp){qp->tail = NULL;}else{jp->next->j_prev = jp->j_prev;}}else if (jp == qp->q_tail){qp->q_tail = jp->j_prev;jp->j_prev->j_next = NULL;}else{jp->j_prev->j_next = jp->j_next;jp->j_next->j_prev = jp->j_prev;}pthread_rwlock_unlock(&qp->q_lock); }struct job *job_find(struct queue *qp, pthread_t id) {struct job *jp;if (pthread_rwlock_rdlock(&qp->q_lock) != 0){return NULL;}for (jp = qb->q_head; jp != NULL; jp = jp->j_next){if (pthread_equal(jp->j_id, id)){break;}}pthread_rwlock_unlock(&qp->q_lock);return jp; }
View Code
#include <pthread.h> #include <time.h> int pthread_rwlock_timedrdlock(pthread_rwlock_t *restrict rwlock, const struct timespec *restrict tsptr); int pthread_rwlock_timedwrlock(pthread_rwlock_t *restrict rwlock, const struct timespec *restrict tsptr);
#include <pthread.h> int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr); int pthread_cond_destroy(pthread_con_t *cond);
#include<pthread.h> int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex) int pthread_cond_timedwait(pthread_cond_t *restrict cond, phtread_mutex_t *restrict mutex, const struct timespec *restrict tsptr)
#include<phtread.h> int pthread_cond_signal(pthread_cond_t *cond) int pthread_cond_broadcast(pthread_cond_t *cond)
![](/assets/blank.gif)
![](/assets/blank.gif)
#include <pthread.h>struct msg {struct msg *m_next; };struct msg *workq;pthread_cond_t qready = PTHREAD_COND_INITIALIZER; pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER;void process_msg(void) {struct msg *mp;for(;;){pthread_mutex_lock(&qlock);while (workq == NULL){pthread_cond_wait(&qready, &qlock);}mp = workq;workq = mp->m_next;pthread_mutex_unlock(&qlock);} }void enqueue_msg(struct msg *mp) {pthread_mutex_lock(&qlock);mp->m_next = workq;workq = mp;pthread_mutex_unlock(&qlock);pthread_cond_signal(&qready); }
View Code
转载于:https://www.cnblogs.com/shenlinken/p/5778564.html
APUE学习之多线程编程(二):线程同步相关推荐
- Win32多线程编程(3) — 线程同步与通信
一.线程间数据通信 系统从进程的地址空间中分配内存给线程栈使用.新线程与创建它的线程在相同的进程上下文中运行.因此,新线程可以访问进程内核对象的所有句柄.进程中的所有内存以及同一个进程中其他所有线程的 ...
- 多线程编程、线程同步|安全和线程通信
多线程编程 多线程的优势 线程在程序中是独立的.并发的执行流,与分隔的进程相比,进程中的线程之间的隔离程度要小.他们共享内存.文件句柄和其他每个进程应有的状态. 因为线程的划分尺度小于进程,使得多线程 ...
- java多线程同步与死锁,廖雪峰Java11多线程编程-2线程同步-3死锁
在多线程编程中,要执行synchronized块,必须首先获得指定对象的锁. 1.Java的线程锁是可重入的锁 public void add(int m){ synchronized (lock){ ...
- VC++中多线程学习(MFC多线程)三(线程同步包含:原子互锁、关键代码段、互斥器Mutex、Semaphores(信号量)、Event Objects(事件))
目录 线程同步的必要性: 2.解决同步问题的方法 2.1原子互锁家族函数 2.2Critical Sections(关键代码段.关键区域.临界区域) 2.3 互斥器Mutex ...
- iOS多线程编程:线程同步总结 NSCondtion
1:原子操作 - OSAtomic系列函数 iOS平台下的原子操作函数都以OSAtomic开头,使用时需要包含头文件<libkern/OSBase.h>.不同线程如果通过原子操作函数对同一 ...
- 多线程编程之线程同步主要函数一览
互斥锁 int pthread_mutex_init(pthread_mutex_t *restrict, const pthread_mutexattr_t *restrict); int pthr ...
- 多线程编程之三——线程间通讯
七.线程间通讯 一般而言,应用程序中的一个次要线程总是为主线程执行特定的任务,这样,主线程和次要线程间必定有一个信息传递的渠道,也就是主线程和次要线程间要进行通信.这种线程间的通信不但是难以避免的,而 ...
- python学习笔记——多线程编程
python学习笔记--多线程编程 基础不必多讲,还是直接进入python. Python代码代码的执行由python虚拟机(也叫解释器主循环)来控制.Python在设计之初就考虑到要在主循环中,同时 ...
- 【转】1.3异步编程:线程同步基元对象
开始<异步编程:同步基元对象(上)> 示例:异步编程:线程同步基元对象.rar 如今的应用程序越来越复杂,我们常常需要多线程技术来提高我们应用程序的响应速度.每个线程都由自己的线程ID,当 ...
最新文章
- 解释一下c语言 for(;;) printf(*);,printf()函数的一个问题
- platform下的js分析_1
- 使用参数化SQL语句进行模糊查找
- 基于Netty的http服务器
- hadoop Connection refused: no further information原因排查(Centos7)
- Python入门5_条件循环语句
- 怎样更改计算机ip用户名,无法修改系统IP地址
- 机器学习入门——线性回归详细分析
- vant-list上拉加载onload事件触发多次
- SCAU 正n多边形类的定义与使用
- 免费好用的图片压缩网站,有这五个就够了(收藏备用)
- linux环境vmd安装,Ubuntu下VMD安装
- 3D动画制作流程概要
- 计算机班级学生分析,【本班学生学业成绩状况】_本班学生情况分析报告
- APP 的开发费用标准是什么?
- Photoshop学习(二):换色
- 矩阵中的旋转(Rotation)
- B - 最少硬币问题
- 云计算实验2 Spark分布式内存计算框架配置及编程案例
- 解决Xposed不联网问题,附带Xposed安装教程雷电夜神逍遥模拟器