Linux多线程编程

发表于:2012-8-10 09:38

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:luxiaoxun    来源:51Testing软件测试网采编

  设置分离属性:

  int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)
  int pthread_attr_getdetachstate(const pthread_attr_t *tattr,int *detachstate)

  detachstate PTHREAD_CREATE_DETACHED:分离

  PTHREAD _CREATE_JOINABLE:非分离

  设置调度策略:

  int pthread_attr_setschedpolicy(pthread_attr_t * tattr, int policy)
  int pthread_attr_getschedpolicy(pthread_attr_t * tattr, int *policy)

  policy SCHED_FIFO:先入先出

  SCHED_RR:循环

  SCHED_OTHER:实现定义的方法

  设置优先级:

  int pthread_attr_setschedparam (pthread_attr_t *attr, struct sched_param *param)
  int pthread_attr_getschedparam (pthread_attr_t *attr, struct sched_param *param)

  3、线程访问控制

  1)互斥锁(mutex)

  通过锁机制实现线程间的同步。同一时刻只允许一个线程执行一个关键部分的代码。

int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr);
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_destroy(pthread_mutex_t *mutex);

  (1)先初始化锁init()或静态赋值pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIER

  (2)加锁,lock,trylock,lock阻塞等待锁,trylock立即返回EBUSY

  (3)解锁,unlock需满足是加锁状态,且由加锁线程解锁

  (4)清除锁,destroy(此时锁必需unlock,否则返回EBUSY)

  mutex 分为递归(recursive) 和非递归(non-recursive)两种,这是POSIX 的叫法,另外的名字是可重入(Reentrant) 与非可重入。这两种mutex 作为线程间(inter-thread) 的同步工具时没有区别,它们的惟一区别在于:同一个线程可以重复对recursive mutex 加锁,但是不能重复对non-recursive mutex 加锁。

  首选非递归mutex,绝对不是为了性能,而是为了体现设计意图。non-recursive 和recursive 的性能差别其实不大,因为少用一个计数器,前者略快一点点而已。在同一个线程里多次对non-recursive mutex 加锁会立刻导致死锁,我认为这是它的优点,能帮助我们思考代码对锁的期求,并且及早(在编码阶段)发现问题。毫无疑问recursive mutex 使用起来要方便一些,因为不用考虑一个线程会自己把自己给锁死了,我猜这也是Java 和Windows 默认提供recursive mutex 的原因。(Java 语言自带的intrinsic lock 是可重入的,它的concurrent 库里提供ReentrantLock,Windows的CRITICAL_SECTION 也是可重入的。似乎它们都不提供轻量级的non-recursive mutex。)

53/5<12345>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号