linux多线程1.线程概述线程是一个进程内的基本调度单位,也可以称为轻量级进程。线程是在共享内存空间中并发的多道执行路径,它们共享一个进程的资源,如文件描述和信号处理。因此,大大减少了上下文切换的开销。一个进程可以有多个线程,也就是有多个线程控制表及堆栈寄存器,但却共享一个用户地址空间。2.线程实现线程创建pthread_create()所需头文件#include<pthread.h>函数原型intpthread_create((pthread_t*thread,pthread_attr_t*attr,thread:线程标识符attr:线程属性设置start_routine:线程函数的起始地址arg:传递给start_routine的参数函数返回值成功:0出错:-1线程退出pthread_exit();所需头文件#include<pthread.h>函数原型voidpthread_exit(void*retval)函数传入值retval:pthread_exit()调用者线程的返回值,可由其他函数如pthread_join来检索获取等待线程退出并释放资源pthread_join()所需头文件#include<pthread.h>函数原型intpthread_join((pthread_tth,void**thread_return))函数传入值th:等待线程的标识符thread_return:用户定义的指针,用来存储被等待线程的返回值(不为NULL时)函数返回值成功:0出错:-1代码举例1.#include<pthread.h>2.#include<stdio.h>3.#include<errno.h>4.5./*线程1*/6.voidthread1()7.{8.inti=0;9.10.while(1)11.{12.printf(thread1:%d/n,i);13.if(i>3)14.pthread_exit(0);15.i++;16.sleep(1);17.}18.}19.20./*线程2*/21.voidthread2()22.{23.inti=0;24.25.while(1)26.{27.printf(thread2:%d/n,i);28.if(i>5)29.pthread_exit(0);30.i++;31.sleep(1);32.}33.}34.35.intmain()36.{37.pthread_tt1,t2;38.39./*创建线程*/40.pthread_create(&t1,NULL,(void*)thread1,NULL);41.pthread_create(&t2,NULL,(void*)thread2,NULL);42./*等待线程退出*/43.pthread_join(t1,NULL);44.pthread_join(t2,NULL);45.return0;46.}3同步与互斥<1>互斥锁互斥锁的操作主要包括以下几个步骤。•互斥锁初始化:pthread_mutex_init•互斥锁上锁:pthread_mutex_lock•互斥锁判断上锁:pthread_mutex_trylock•互斥锁接锁:pthread_mutex_unlock•消除互斥锁:pthread_mutex_destroy1.#include<pthread.h>2.#include<stdio.h>3.#include<errno.h>4.5.inti=0;/*共享变量*/6.pthread_mutex_tmutex=PTHREAD_MUTEX_INITIALIZER;/*互斥锁*/7.8.voidthread1()9.{10.intret;11.while(1)12.{13.14.15.ret=pthread_mutex_trylock(&mutex);/*判断上锁*/16.17.if(ret!=EBUSY)18.{19.pthread_mutex_lock(&mutex);/*上锁*/20.printf(Thisisthread1:%d/n,i);21.i++;22.pthread_mutex_unlock(&mutex);/*解锁*/23.}24.sleep(1);25.}26.}27.28.voidthread2()29.{intret;30.while(1)31.{32.33.ret=pthread_mutex_trylock(&mutex);34.if(ret!=EBUSY)35.{36.pthread_mutex_lock(&mutex);37.printf(Thisisthread2:%d/n,i);38.i++;39.pthread_mutex_unlock(&mutex);40.}41.sleep(1);42.}43.}44.intmain()45.{46.pthread_tt1,t2;47.pthread_mutex_init(&mutex,NULL);48.pthread_create(&t1,NULL,(void*)thread1,NULL);49.pthread_create(&t2,NULL,(void*)thread2,NULL);50.51.pthread_join(t1,NULL);52.pthread_join(t2,NULL);53.54.pthread_mutex_destroy(&mutex);55.return0;56.}<2>信号量未进行同步处理的两个线程1.#include<pthread.h>2.#include<stdio.h>3.#include<errno.h>4.5.inti=0;6.voidthread1()7.{8.9.while(1)10.{11.printf(Thisisthread1:%d/n,i);12.i++;13.sleep(1);14.}15.}16.17.18.voidthread2()19.{20.21.while(1)22.{23.printf(Thisisthread2:%d/n,i);24.i++;25.sleep(1);26.}27.}28.29.intmain()30.{31.pthread_tt1,t2;32.33.pthread_create(&t1,NULL,(void*)thread1,NULL);34.pthread_create(&t2,NULL,(void*)thread2,NULL);