Chinaunix首页 | 论坛 | 博客
  • 博客访问: 396893
  • 博文数量: 87
  • 博客积分: 2571
  • 博客等级: 少校
  • 技术积分: 920
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-29 13:10
文章分类

全部博文(87)

文章存档

2012年(49)

2011年(7)

2010年(26)

2009年(5)

分类: LINUX

2010-04-07 11:09:10

LinuxThread中的关键库函数

  1.1线程的创建和终止

  int pthread_create(pthread_t * pthread,const pthread_attr_t *attr,void *(*start_routine(*void)),void *arg);调用此函数可以创建一个新的线程,新线程创建后执行start_routine 指定的程序。其中参数attr是用户希望创建线程的属性,当为NULL时表示以默认的属性创建线程。arg是向start_routine 传递的参数。当成功创建一个新的线程时,系统会自动为新线程分配一个线程ID号,并通过pthread 返回给调用者。

  void pthread_exit(void *value_ptr);调用该函数可以退出线程,参数value_ptr是一个指向返回状态值的指针。

  1.2线程控制函数

  pthread_self(void);为了区分线程,在线程创建时系统为其分配一个唯一的ID号,由pthread_create()返回给调用者,也可以通过pthread_self()获取自己的线程ID。

  Int pthread_join (pthread- t thread , void * *status);这个函数的作用是等待一个线程的结束。调用pthread_join()的线程将被挂起直到线程ID为参数thread 指定的线程终止。

  int pthread_detach(pthread_t pthread);参数pthread代表的线程一旦终止,立即释放调该线程占有的所有资源。

  1.3线程间的互斥

  互斥量和临界区类似,只有拥有互斥量的线程才具有访问资源的权限,由于互斥对象只有一个,这就决定了任何情况下共享资源(代码或变量)都不会被多个线程同时访问。使用互斥不仅能够在同一应用程序的不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。Linux中通过pthread_mutex_t来定义互斥体机制完成互斥操作。具体的操作函数如下

  pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *attr);初使化一个互斥体变量mutex,参数attr表示按照attr属性创建互斥体变量mutex,如果参数attr为NULL,则以默认的方式创建。

  pthread_mutex_lock(pthread_mutex_t *mutex);给一个互斥体变量上锁,如果mutex指定的互斥体已经被锁住,则调用线程将被阻塞直到拥有mutex的线程对mutex解锁为止。

  Pthread_mutex_unlock(pthread_mutex_t *mutex);对参数mutex指定的互斥体变量解锁。

  1.4线程间的同步

  同步就是线程等待某一个事件的发生,当等待的事件发生时,被等待的线程和事件一起继续执行。如果等待的事件未到达则挂起。在linux操作系统中是通过条件变量来实现同步的。

  Pthread_cond_init(pthread_cond_t *cond,const pthread_cond_t *attr);这个函数按参数attr指定的属性初使化一个条件变量cond。

  Pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);等待一个事件(条件变量)的发生,发出调用的线程自动阻塞,直到相应的条件变量被置1。等待状态的线程不占用CPU时间。

  pthread_cond_signal(pthread_cond_t *cond);解除一个等待参数cond指定的条件变量的线程的阻塞状态.

2.实例

    在这里利用多线程技术实现生产者和消费者问题,生产者线程向一缓冲区中写数据,消费者线程从缓冲区中读取数据,由于生产者线程和消费者线程共享同一缓冲区,为了正确读写数据,在使用缓冲队列时必须保持互斥。生产者线程和消费者线程必须满足:生产者写入缓冲区的数目不能超过缓冲区容量,消费者读取的数目不能超过生产者写入的数目。在程序中使用了一个小技巧来判断缓冲区是空还是满。在初始化时读指针和写指针为0;如果读指针等于写指针,则缓冲区是空的;如果(写指针+ 1) % N 等于读指针,则缓冲区是满的,%表示取余数,这时实际上有一个单元空出未用。

 #include
 #include

 #define BUFFER_SIZE 8
  #define GET_POS(x) ((x + 1) % BUFFER_SIZE)

 struct prodcons {
  int buffer[BUFFER_SIZE];
    pthread_mutex_t lock;      //互斥LOCK
  int readpos , writepos;
  pthread_cond_t notempty;   //缓冲区非空条件判断
  pthread_cond_t notfull;    //缓冲区未满条件判断
 };

 void init(struct prodcons * b){

  pthread_mutex_init(&b->lock,NULL);
  pthread_cond_init(&b->notempty,NULL);
  pthread_cond_init(&b->notfull,NULL);
  b->readpos=0;
  b->writepos=0;
 }

void put(struct prodcons* b,int data){
  pthread-_mutex_lock(&b->lock);
  if( (GET_POS(b->writepos) == GET_POS(b->readpos)) && (b->writepos > b->readpos) )
  {
      pthread_cond_wait(&b->notfull, &b->lock);//等待“非满池”信号

    }
  b->buffer[GET_POS(b->writepos)]=data;
  b->writepos++;

  pthread_cond_signal(&b->notempty);//设置“非空池”信号
  pthread_mutex_unlock(&b->lock);
}

int get(struct prodcons *b){

  int data;
  pthread_mutex_lock(&b->lock);
  if( (GET_POS(b->writepos) == GET_POS(b->readpos)) && (b->writepos == b->readpos) )
  {
      pthread_cond _wait(&b->notempty, &b->lock);//等待“非空池”信号
  }
  data = b->buffer[GET_POS(b->readpos)];
  b->readpos++;

  pthread_cond_signal(&b->notfull);//设置“非满池”信号
  pthread_mutex_unlock(&b->lock);
  return data;
}

 

 

阅读(731) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~