Linux下的线程控制

一.线程的必要性
      1.某个非常耗时的操作,可由单独的线程完成
      2.线程共享进程的地址空间,文件描述符等
      3.线程私有数据包括:(1)线程号(2)寄存器(3)堆栈(4)信号掩码(5)优先级(6)线程私有的存储空间
二.创建进程
      1.相关函数
Code
      2.线程属性
Code
      pthread_once:
Code
三.终止线程
      1.线程函数返回;main返回时所有线程结束;
      2.pthread_exit();子线程仍继续,进程也末消亡;
      终止线程相关:
      (1).释放临界资源.pthread_cleanup_push(routine,arg)与pthread_cleanup_pop()中如调用返回,则执行
routine清理函数,这两个宏需成对出现;
      (2).线程间同步.
1 #include <pthread.h>
2 void pthread_exit(void *retval);
3 void pthread_join(pthread_t th,void *thread_return);       //挂起等待th结束,*thread_return=retval;
4 int pthread_detach(pthread_t th); 
      线程只能被一个线程等待终止(第一个能正常返回),并且应处于join状态(非DETACHED),因此避免内存泄漏,所
有线程应调用pthread_detach()(被设置为DETACHED)或被一个线程pthread_join(),例子:
Code
四.私有数据
      1.线程中的全局变量为所有线程共有,所以象erron这样的变量得通过TSD(Thread-specific Data)解决,采用一
键多值技术;为每个键指定一个键值.
      2.操作线程数据的函数:
Code
TSD程序如下:
Code
五.线程同步
      1.互斥锁

1 int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr);
2 int pthread_mutex_lock(pthread_mutex *mutex);
3 int pthread_mutex_destroy(pthread_mutex *mutex);
4 int pthread_mutex_unlock(pthread_mutex *
      (1)先初始化锁init()或静态赋值pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIER
      attr_t有:
      PTHREAD_MUTEX_TIMED_NP:其余线程等待队列
      PTHREAD_MUTEX_RECURSIVE_NP:嵌套锁,允许线程多次加锁,不同线程,解锁后重新竞争
      PTHREAD_MUTEX_ERRORCHECK_NP:检错,与一同,线程请求已用锁,返回EDEADLK;
      PTHREAD_MUTEX_ADAPTIVE_NP:适应锁,解锁后重新竞争
      (2)加锁,lock,trylock,lock阻塞等待锁,trylock立即返回EBUSY
      (3)解锁,unlock需满足是加锁状态,且由加锁线程解锁
      (4)清除锁,destroy(此时锁必需unlock,否则返回EBUSY,//Linux下互斥锁不占用资源内存
      2.条件变量(需用锁保护)通过线程共享的全局变量进行同步.等待使用资源的线程等待条件变量被
      设置为真.另一个线程使用完资源后,设置条件变量为真

1 int pthread_cond_init(pthread_cond_t *cond,pthread_condattr_t *cond_attr);     
2 int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);
3 int pthread_cond_timewait(pthread_cond_t *cond,pthread_mutex *mutex,const timespec *abstime);
4 int pthread_cond_destroy(pthread_cond_t *cond);  
5 int pthread_cond_signal(pthread_cond_t *cond);
6 int pthread_cond_broadcast(pthread_cond_t *cond);  //解除所有线程的阻塞
      (1)初始化.init()或者pthread_cond_t cond=PTHREAD_COND_INITIALIER;属性置为NULL
      (2)等待条件成立.pthread_wait,pthread_timewait.wait()释放锁,并阻塞等待条件变量为真
      timewait()设置等待时间,仍未signal,返回ETIMEOUT(加锁保证只有一个线程wait)
      (3)激活条件变量:pthread_cond_signal,pthread_cond_broadcast(激活所有等待线程)
      (4)清除条件变量:destroy;无线程等待,否则返回EBUSY
      演示条件变量的例子:
Code
      3.异步信号(只有一个线程收到异步信号)
1 int pthread_kill(pthread_t thread,int signum);
2 int pthread_sigmask(int how,const sigset_t *newmask,const sigset_t *oldmask);
3 int sigwait(const sigset_t *set,int *sig);//等待指定信号到来,并存入*sig
六.出错处理
      1.错误检查(要先令errno=0);
      2.错误码(man errno)
      3.错误提示信息perror(const char *message),char *strerror(int errno);
posted @ 2009-10-11 16:57  geekemacser  阅读(701)  评论(0)    收藏  举报