【Linux】 多线程编程(互斥锁实现互斥)
线程的优点:减少处理机的空转时间,支持多处理器及减少上下文切换开销线程的退出不能使用exit(),由于exit()的作用是使调用进程终止,可以使用pthread_exit()由于一个进程中的多个线程是共享数据段,因此,线程在退出之后,退出线程所占用的资源并不会随着
线程的优点:减少处理机的空转时间,支持多处理器及减少上下文切换开销
线程的退出不能使用exit(),由于exit()的作用是使调用进程终止,可以使用pthread_exit()
由于一个进程中的多个线程是共享数据段,因此,线程在退出之后,退出线程所占用的资源并不会随着线程的中止而释放,正如进程之间可以用wait()函数来进行同步终止并释放资源一样,线程之间是使用pthread_join()函数
pthread_join()函数用于将当前线程挂起来等待线程的结束,这个函数是一个线程阻塞函数,调用它的函数一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源就被收回,pthread_exit()函数是主用终止自身线程,但在很多线程的应用中,经常会遇到别的线程要终止另一个线程的问题,此时调用pthread_cancel()函数来实现这种功能。在被取消的线程的内部需要调用pthread_setcancel()函数和pthread_setanceltype()函数设置自己的取消状态,例如,被取消的进程接收到另一个线程的取消请求之后,需要接受或忽略这个请求。如果接受,则再判断立刻采取终止操作还是等待某个函数的调用
由于线程共享进程的资源和地址空间,在对这些资源进行操作时,就必须要考虑到线程间资源访问的同步与互斥问题
有两种机制:互斥锁和信号量,互斥锁适用于可用资源是唯一的情况,信号量适用于可用资源为多个的情况
互斥锁的基本函数:
1、pthread_mutex_init():互斥锁初始化
2、pthread_mutex_lock():互斥锁上锁
3、pthread_mutex_trylock():互斥锁判断上锁
4、pthread_mutex_unlock():互斥锁解锁
5、pthread_mutex_destory():消除互斥锁
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define THREAD_NUM 3
#define REPEAT_NUM 3
#define DELAY_TIME_LEVLES 5.0
pthread_mutex_t mutex;
void *thread_fun(void *arg)
{
int no = (int) arg;
int delay;
int ret,i;
ret = pthread_mutex_lock(&mutex); //返回0为成功
if(ret)
{
printf("Thread %d lock failed\n",no);
pthread_exit(NULL);
}
for(i=0;i<REPEAT_NUM;i++)
{
delay = (int)(rand()*DELAY_TIME_LEVELS/(RAND_MAX))+1;
sleep(delay);
printf("Thread %d: job %d delay = %d\n",no,i,delay);
}
printf("Thread %d finished\n",no);
pthread_exit
}
int main()
{
pthread_t thread[THREAD_NUM];
int i,ret;
void *thrd;
srand(time(NULL));
pthread_mutex_init(&mutex,NULL);
for(i=0;i<THREAD_NUM;i++)
{
ret = pthread_create(&thread[i],NULL,thread_fun,(void *)i);
if(ret!=0)
{
printf("Create %d failed\n",i);
exit(ret);
}
}
printf("Create thread success!\n Waiting for threads to finish ...\n");
for(i=0;i<THREAD_NUM;i++)
{
ret = pthread_join(thread[i],&thrd);
pthread_mutex_unlock(&mutex);
}
pthread_mutex_destroy(&mutex);
return 0;
}
更多推荐
所有评论(0)