第八章 Linux线程.ppt

  1. 1、本文档共62页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第八章 Linux线程

* * * 3-1pthread_mutex pthread_mutex_t job_queue_mutex = PTHREAD_MUTEX_INITIALIZER; void* thread_function (void* arg) { while (1) { struct job* next_job; pthread_mutex_lock (job_queue_mutex); if (job_queue == NULL) next_job = NULL; else { next_job = job_queue; job_queue = job_queue-next; } pthread_mutex_unlock (job_queue_mutex); if (next_job == NULL) break; proces_job (next_job); free (next_job); } return NULL; } 初始化互斥体 获得互斥体 释放互斥体 受保护区域 为什么不在这里跳出? 3-1 互斥体死锁 互斥体提供了一个线程阻止另一个线程的机制 导致不可能出现的情况的状态,称之为死锁 尝试获得两次互斥体 三种互斥体 一般互斥体 递归互斥体 调用同样次数的lock和unlock 纠错互斥体 第二次获取互斥体时会返回错误码EDEADLK 3-1互斥体死锁 pthread_mutexattr_t 初始化 设置属性 销毁属性 int pthread_mutexattr_init(pthread_mutexattr_t *attr); int pthread_mutexattr_destroy(pthread_mutexattr_t *attr); int pthread_mutexattr_gettype(const pthread_mutexattr_t *restrict attr, int *restrict type); int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type); PTHREAD_MUTEX_NORMAL PTHREAD_MUTEX_RECURSIVE PTHREAD_MUTEX_ERRORCHECK PTHREAD_MUTEX_DEFAULT 3-1非阻塞互斥体测试 线程调用pthread_mutex_lock可能会导致阻塞。 不阻塞的互斥体函数 int pthread_mutex_trylock(pthread_mutex_t *mutex); 1.如果互斥体未被其他线程锁定,获得互斥体,返回0 2.如果互斥体已被其他线程锁定,返回错误码 –EBUSY,不阻塞 3-2线程信号量 防止工作列表为空 同步 让工作任务阻塞以等待新的任务到达 信号量 协调多个线程的计数器 GNU/Linux保证信号量的取值和赋值不会造成竞争状态 信号量的操作 wait: 信号量减一 操作阻塞直到信号量为正 post: 信号量加一 如果有线程等待,则有一个线程解除等待状态 3-3线程信号量 Linux实现了两种信号量 进程间信号量 线程间信号量 sempahore.h sem_t 3-3线程信号量 初始化 等待 投递 销毁 int sem_init(sem_t *sem, int pshared, unsigned int value); int sem_wait(sem_t *sem); int sem_trywait(sem_t *sem); int sem_post(sem_t *sem); int sem_destroy(sem_t *sem); 信号量的初始值 应该为0 类似于pthread_mutex_trylock(),是一个非阻塞版本 3-3线程信号量 void initialize_job_queue () { job_queue = NULL; sem_init (job_queue_count, 0, 0); } 1.初始化semaphore 2.当job_queue为空的时候,semaphore的值为零 3-3线程信号量 void* thread_function (void* arg) { while (1) {

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档