Chinaunix首页 | 论坛 | 博客
  • 博客访问: 70764
  • 博文数量: 83
  • 博客积分: 1320
  • 博客等级: 中尉
  • 技术积分: 805
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-20 14:54
文章分类

全部博文(83)

文章存档

2010年(83)

我的朋友

分类:

2010-08-02 09:58:03

1.pthread prototype:
#include

int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr,void *(*start_rtn)(void), void *restrict arg);

Returns: 0 if OK, error number on failure

2. 条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。  
   
  创建和注销 
  
  条件变量和互斥锁一样,都有静态动态两种创建方式,静态方式使用PTHREAD_COND_INITIALIZER常量,如下:   
  pthread_cond_t   cond=PTHREAD_COND_INITIALIZER   
  
  动态方式调用pthread_cond_init()函数,API定义如下:   
  int   pthread_cond_init(pthread_cond_t   *cond,   pthread_condattr_t   *cond_attr)   
  
  尽管POSIX标准中为条件变量定义了属性,但在LinuxThreads中没有实现,因此cond_attr值通常为NULL,且被忽略。 
  
  注销一个条件变量需要调用pthread_cond_destroy(),只有在没有线程在该条件变量上等待的时候才能注销这个条件变量,否则返回 EBUSY。因为Linux实现的条件变量没有分配什么资源,所以注销动作只包括检查是否有等待线程。API定义如下:   
  int   pthread_cond_destroy(pthread_cond_t   *cond)  
3.等待和激发  
  
int   pthread_cond_wait(pthread_cond_t   *cond,   pthread_mutex_t   *mutex) 
  int   pthread_cond_timedwait(pthread_cond_t   *cond,   pthread_mutex_t   *mutex,   const   struct   timespec   *abstime)   
  
  
  
  等待条件有两种方式:无条件等待pthread_cond_wait()和计时等待pthread_cond_timedwait(),其中计时等待方式如果在给定时刻前条件没有满足,则返回ETIMEOUT,结束等待,其中abstime以与time()系统调用相同意义的绝对时间形式出现,0表示格林尼治时间1970年1月1日0时0分0秒。 
  
  无论哪种等待方式,都必须和一个互斥锁配合,以防止多个线程同时请求pthread_cond_wait()(或 pthread_cond_timedwait(),下同)的竞争条件(Race   Condition)。mutex互斥锁必须是普通锁(PTHREAD_MUTEX_TIMED_NP)或者适应锁(PTHREAD_MUTEX_ADAPTIVE_NP),且在调用pthread_cond_wait()前必须由本线程加锁(pthread_mutex_lock()),而在更新条件等待队列以前,mutex保持锁定状态,并在线程挂起进入等待前解锁。在条件满足从而离开 pthread_cond_wait()之前,mutex将被重新加锁,以与进入pthread_cond_wait()前的加锁动作对应。 
4.pthread_cond_signal函数的作用是发送一个信号给另外一个正在处于阻塞等待状态的线程,使其脱离阻塞状态,继续执行.如果没有线程处在阻塞等待状态,pthread_cond_signal也会成功返回。
5.pthread_join使一个线程等待另一个线程结束。
代码中如果没有pthread_join主线程会很快结束从而使整个进程结束,从而使创建的线程没有机会开始执行就结束了。加入pthread_join后,主线程会一直等待直到等待的线程结束自己才结束,使创建的线程有机会执行。所有线程都有一个线程号,也就是Thread ID。其类型为pthread_t。通过调用pthread_self()函数可以获得自身的线程号。
阅读(611) | 评论(0) | 转发(0) |
0

上一篇:ioctl

下一篇:html

给主人留下些什么吧!~~