Chinaunix首页 | 论坛 | 博客
  • 博客访问: 471613
  • 博文数量: 223
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2145
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-01 10:23
个人简介

该坚持的时候坚持,该妥协的时候妥协,该放弃的时候放弃

文章分类

全部博文(223)

文章存档

2017年(56)

2016年(118)

2015年(3)

2014年(46)

我的朋友

分类: C/C++

2016-10-21 22:43:26

一、线程互斥
1.
线程概念
线程就是“轻量级”的进程。
线程与创建它的进程共享代码段,数据段
线程拥有自己独立的栈

2.函数学习
创建线程:int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
头文件:   编译时需要连接-phtread
成功:0 失败:返回错误数字
*thread:函数创建的线程id
*attr:创建线程的属性,NULL
void *(*start_routine)(void *):运行的函数
*arg:函数的参数

等待函数结束:pthread_join
函数原型:int pthread_join(pthread_t thread, void **retval);
头文件: 编译时需要连接-phtread
成功:0 失败:返回错误数字
thread:等待结束的线程id
**retval:保存线程退出时的状态,一般为NULL

退出线程:pthread_exit
函数原型:void pthread_exit(void *retval);
头文件: 编译时需要连接-phtread
返回值为空
*retval:保存线程退出时的状态

3.线程互斥
在实际应用中,多个线程往往会访问同一数据或资源,为避免线程之间相互影响,需要引入线程互斥机制,而互斥锁(mutex)互斥机制中的一种。
初始化mutex: int pthread_mutex_init(pthread_mutex_t *retrict mutex, const pthread_mutexattr_t *restrict attr);
头文件: 
成功:0 失败:错误数字
mutex:互斥锁的地址
attr:互斥锁的属性

互斥锁上锁:int pthread_mutex_lock(pthread_mutex_t *mutex);
头文件: 
成功:0 失败:错误数字
mutex:互斥锁的地址

互斥锁解锁:int pthread_mutex_unlock(pthread_mutex_t *mutex);
头文件: 
成功:0 失败:错误数字
mutex:互斥锁的地址

4 编写代码
thread.c

  1. #include <pthread.h>
  2. #include <stdio.h>

  3. pthread_t thread[2];
  4. int number = 0;
  5. pthread_mutex_t mutex;

  6. void *worker1()
  7. {
  8.     int i = 0;
  9.     printf("I am worker1.\n");
  10.     for(i=0;i<10;i++)
  11.     {
  12.         pthread_mutex_lock(&mutex);
  13.         number++;
  14.         pthread_mutex_unlock(&mutex);
  15.         printf("worker1 number is %d\n", number);

  16.         sleep(1);
  17.     }
  18.     pthread_exit(NULL);
  19. }

  20. void *worker2()
  21. {
  22.     int i = 0;
  23.     printf("I am worker2.\n");
  24.     for(i=0;i<10;i++)
  25.     {
  26.         pthread_mutex_lock(&mutex);
  27.         number++;
  28.         pthread_mutex_unlock(&mutex);
  29.         printf("worker2 number is %d\n", number);

  30.         sleep(1);
  31.     }
  32.     pthread_exit(NULL);
  33. }

  34. void main()
  35. {
  36.     pthread_mutex_init(&mutex, NULL);
  37.     /*创建工人1线程*/
  38.     pthread_create(&thread[0], NULL, worker1, NULL);

  39.     /*创建工人2线程*/
  40.     pthread_create(&thread[1], NULL, worker2, NULL);

  41.     /*等待工人1线程结束*/
  42.     pthread_join(thread[0], NULL);

  43.     /*等待工人2线程结束*/
  44.     pthread_join(thread[1], NULL);

  45.     return;
  46. }
二、线程同步
1.线程同步
多个线程按照规定的顺序来执行,即为线程同步。

2.条件变量
初始化
pthread_cond_t cond_ready=PTHREAD_COND_INITIALIZER;
等待条件成熟
pthread_cond_wait(&cond_ready, &mut);
设置条件成熟
pthread_cond_signal(&cond_ready);

sync.c:

  1. #include <sys/types.h>
  2. #include <pthread.h>

  3. int number = 0;
  4. pthread_t pthread[2];
  5. pthread_mutex_t mut;
  6. pthread_cond_t cond_ready = PTHREAD_COND_INITIALIZER;

  7. void studentA()
  8. {
  9.     int i;
  10.     /*扫5次地*/
  11.     for(i=0;i<5;i++)
  12.     {
  13.         pthread_mutex_lock(&mut);
  14.         number++;
  15.         if(number >=5)
  16.         {
  17.             printf("student A has funished his work!\n");
  18.             /*通知B同学*/
  19.             pthread_cond_signal(&cond_ready);
  20.         }
  21.         pthread_mutex_unlock(&mut);
  22.         /*休息1秒钟*/
  23.         sleep(1);
  24.     }

  25.     /*退出*/
  26.     pthread_exit(NULL);
  27. }

  28. void studentB()
  29. {
  30.     pthread_mutex_lock(&mut);
  31.     if(number < 5) /*判断A是否已经扫完5次地*/
  32.         pthread_cond_wait(&cond_ready, &mut);
  33.     /*拖地*/
  34.     number = 0;
  35.     printf("sudent B has finished his work.\n");
  36.     /*退出*/
  37.     pthread_exit(NULL);
  38. }

  39. int main()
  40. {
  41.     pthread_mutex_init(&mut, NULL);
  42.     /*创建A同学线程*/
  43.     pthread_create(&pthread[0], NULL, studentA, NULL);
  44.     /*创建B同学线程*/
  45.     pthread_create(&pthread[1], NULL, studentB, NULL);
  46.     /*等待A同学线程结束*/
  47.     pthread_join(pthread[0], NULL);
  48.     /*等待B同学线程结束*/
  49.     pthread_join(pthread[1], NULL);
  50. }


阅读(835) | 评论(0) | 转发(0) |
0

上一篇:消息队列编程

下一篇:Linux网络编程协议

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