Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1246443
  • 博文数量: 105
  • 博客积分: 127
  • 博客等级: 入伍新兵
  • 技术积分: 962
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-29 15:22
文章分类

全部博文(105)

文章存档

2021年(1)

2019年(3)

2018年(1)

2017年(11)

2016年(47)

2015年(32)

2014年(4)

2012年(6)

我的朋友

分类: LINUX

2015-09-02 09:44:07

                 linux 线程

    最近在做一些应用层上的事情,其中关于线程的部分,很多印象都很模糊。这也可能是因为以前没有在应用层做过项目,
只是停留在课本,
或者实验上。这里暂时对这次遇到的线程相关的函数作个记录。主要是给自己以后查看。

 

头文件:#include <pthread.h>

编译:需要加入 –lpthread

 

相关类型

pthread_t:线程ID

pthread_attr_t:线程属性


点击(此处)折叠或打开

  1. 基本函数
  2. pthread_create():创建一个线程
  3. pthread_exit():终止当前线程
  4. pthread_cancel():中断另外一个线程的运行
  5. pthread_join():阻塞当前的线程,直到另外一个线程运行结束
  6. pthread_attr_init():初始化线程的属性
  7. pthread_attr_destroy():删除线程的属性
  8. pthread_kill():向线程发送一个信号

  9. 同步函数
  10. 用于 mutex 和条件变量
  11. pthread_mutex_init() 初始化互斥锁
  12. pthread_mutex_destroy() 删除互斥锁
  13. pthread_mutex_lock():占有互斥锁(阻塞操作)
  14. pthread_mutex_trylock():试图占有互斥锁(不阻塞操作)。即,当互斥锁空闲时,将占有该锁;否则,立即返回。
  15. pthread_mutex_unlock(): 释放互斥锁
  16. pthread_cond_init():初始化条件变量
  17. pthread_cond_destroy():销毁条件变量
  18. pthread_cond_signal(): 唤醒第一个调用pthread_cond_wait()而进入睡眠的线程
  19. pthread_cond_wait(): 等待条件变量的特殊条件发生
  20. pthread_attr_getschedparam();获取线程优先级
  21. pthread_attr_setschedparam();设置线程优先级

  22. 工具函数
  23. pthread_equal(): 对两个线程的线程标识号进行比较
  24. pthread_detach(): 分离线程
  25. pthread_self(): 查询线程自身线程标识号

下面是生产者,消费者问题的一个实例,也是上面这些函数的一个简单应用吧。

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <pthread.h>
  3. #define BUFFER_SIZE 16 // 缓冲区数量
  4. struct prodcons
  5. {
  6.     // 缓冲区相关数据结构
  7.     int buffer[BUFFER_SIZE]; /* 实际数据存放的数组*/
  8.     pthread_mutex_t lock; /* 互斥体lock 用于对缓冲区的互斥操作 */
  9.     int readpos, writepos; /* 读写指针*/
  10.     pthread_cond_t notempty; /* 缓冲区非空的条件变量 */
  11.     pthread_cond_t notfull; /* 缓冲区未满的条件变量 */
  12. };
  13. /* 初始化缓冲区结构 */
  14. void init(struct prodcons *b)
  15. {
  16.     pthread_mutex_init(&b->lock, NULL);
  17.     pthread_cond_init(&b->notempty, NULL);
  18.     pthread_cond_init(&b->notfull, NULL);
  19.     b->readpos = 0;
  20.     b->writepos = 0;
  21. }
  22. /* 释放线程相关 */
  23. void exit_pthread(struct prodcons *b)
  24. {
  25.     pthread_cond_destroy(&b->notempty);
  26.     pthread_cond_destroy(&b->notfull);
  27.     pthread_mutex_destroy(&b->lock);     
  28. }
  29. /* 将产品放入缓冲区,这里是存入一个整数*/
  30. void put(struct prodcons *b, int data)
  31. {
  32.     pthread_mutex_lock(&b->lock);
  33.     /* 等待缓冲区未满*/
  34.     if ((b->writepos + 1) % BUFFER_SIZE == b->readpos)
  35.     {
  36.         pthread_cond_wait(&b->notfull, &b->lock);
  37.     }
  38.     /* 写数据,并移动指针 */
  39.     b->buffer[b->writepos] = data;
  40.     b->writepos++;
  41.     if (b->writepos >= BUFFER_SIZE)
  42.         b->writepos = 0;
  43.     /* 设置缓冲区非空的条件变量*/
  44.     pthread_cond_signal(&b->notempty);
  45.     pthread_mutex_unlock(&b->lock);
  46. }
  47. /* 从缓冲区中取出整数*/
  48. int get(struct prodcons *b)
  49. {
  50.     int data;
  51.     pthread_mutex_lock(&b->lock);
  52.     /* 等待缓冲区非空*/
  53.     if (b->writepos == b->readpos)
  54.     {
  55.         pthread_cond_wait(&b->notempty, &b->lock);
  56.     }
  57.     /* 读数据,移动读指针*/
  58.     data = b->buffer[b->readpos];
  59.     b->readpos++;
  60.     if (b->readpos >= BUFFER_SIZE)
  61.         b->readpos = 0;
  62.     /* 设置缓冲区未满的条件变量*/
  63.     pthread_cond_signal(&b->notfull);
  64.     pthread_mutex_unlock(&b->lock);
  65.     return data;
  66. }
  67.   
  68.   
  69. /* 测试:生产者线程将1 到100 的整数送入缓冲区,消费者线
  70.    程从缓冲区中获取整数,两者都打印信息*/
  71. #define OVER ( - 1)
  72. struct prodcons buffer;
  73. void *producer(void *data)
  74. {
  75.     int n;
  76.     for (n = 0; n < 100; n++)
  77.     {
  78.         printf("%d --->\n", n);
  79.         put(&buffer, n);
  80.     } put(&buffer, OVER);
  81.     return NULL;
  82. }
  83.   
  84.   
  85. void *consumer(void *data)
  86. {
  87.     int d;
  88.     while (1)
  89.     {
  90.         d = get(&buffer);
  91.         if (d == OVER)
  92.             break;
  93.         printf("--->%d \n", d);
  94.     }
  95.     return NULL;
  96. }
  97.   
  98.   
  99. int main(void)
  100. {
  101.     pthread_t th_a, th_b;
  102.     void *retval;
  103.     init(&buffer);
  104.     /* 创建生产者和消费者线程*/
  105.     pthread_create(&th_a, NULL, producer, 0);
  106.     pthread_create(&th_b, NULL, consumer, 0);
  107.     /* 等待两个线程结束*/
  108.     pthread_join(th_a, &retval);
  109.     pthread_join(th_b, &retval);
  110.     exit_pthread(&buffer);
  111.     return 0;
  112. }

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