前言
在上一篇文章中,代码没有达到预期的结果,在文章的最后给出了问题所在,并给出了临界区的概念,精确的定义可以百度一下。
既然问题是对临界区的同时访问,那么只要保证同一个时刻只有一个线程对其访问应该就能解决问题。
函数介绍
互斥锁
pthread_mutex_t mutex;
初始化函数
int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);
第一个参数是互斥锁,第二参数是互斥锁的属性
互斥锁锁定函数
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
#include<pthread.h> #include<stdio.h> #include<cstdlib> #include<unistd.h> pthread_mutex_t mutex; int threadNum=0;//线程获取的号码 void *threadFuntion(void *arg){ int num=*(int *)arg;//线程编号 sleep(1); pthread_mutex_lock(&mutex); printf("第%d个线程获取的号码:%d\n",num,threadNum);//将号码输出 threadNum++; pthread_mutex_unlock(&mutex); } int main(){ int i,j; printf("演绎linux多线程.第一篇 \n"); printf("by 第XXX个小号 原文(http://blog.csdn.net/ccy0815ccy) \n"); const int N=10; //pthread_mutexattr_t mattr; pthread_mutex_init(&mutex,NULL); pthread_t threadID[N];//线程ID for(i=0;i<N;i++){ pthread_create(&threadID[i],NULL,threadFuntion,&i);//将号码传给线程 } for(j=0;j<N;j++) pthread_join(threadID[j],NULL);//等待线程运行结束 printf("运行完成后threadNum的值:%d\n",threadNum); return 0; }
当有线程锁定互斥锁后(锁定相当于获得该锁的使用权),其他线程将无法对其再次锁定,被阴塞,直到抢到该锁(可能多个线程等待该锁)。
从运行结果可以看出来。号码的分配已经正常,说明线程互斥问题基本解决。
但我在分配号码的基础上增加了线程的启动顺序编号,得到哪个线程获取哪一个号码。结果显然是有问题的。这个是线程的同步(似乎是互斥有点像,但不一样),下一扁再说了