线程的创建,等待,退出
#include cstdio.h
include <pthread.h> //加入线程的头文件
#include <unistd.h>
void * void thread1(void arg)
{
Int i = 0;
while(1)
{
If(i>5)
{ //线程的主动退出参数为NULL,该线程退出不带出来值
Pthread_exit(NULL);
}
printf( "play music\n");
sleep(1);
}
}
void*thread2(void * arg)i
{
while(1)
{
printf("play basketyn " );
sleep(i);
}
}
int main(void)
{
pthread_t pid1,pid2; //创建线程1
pthread.sreate(&pidi,NULL,thread1,NULL);
pthread_create( &pid2,NULL,thread2,NULL);//创建线程2
int j=0;
while(1)
{
if(j>10)
{ //线程被被动取消 参数∶线程的ID号
pthread_cancel(pid2);
}
printf("main thread\n");
sleep(1);
j++;
}
//等待子线程结束
pthread_ join(pid1,NULL);
pthread_join(pid2,NULL);
return 0;
}
创建进程的同时会复制父进程的堆区,栈区,常量区,bss,data和代码段。
创建线程的时候只会复制栈区。
多线程的优点:
线程之间除了栈区的内容其他都是共享的。
缺点:互斥和同步
线程和进程的区别:
1)创建和销毁较频繁使用线程,因为创建进程花销大。
2)需要大量数据传送使用线程,因为多线程切换速度快,不需要跨越进程边界。
3)安全稳定选进程;快速频繁选线程;
互斥:多线程不允许同时访问临界资源
同步:多线程在访问临界资源时,按照一定的操作顺序来访问。
引入互斥锁的目的:互斥锁主要用来保护临界资源,保证共享数据操作的完整性。
任何时刻最多只能有一个线程能访问该资源。线程必须先获得互斥锁才能访问临界资源,访问完资源后释放该锁。如果无法获得锁,线程会阻塞直到获得锁为止。
互斥锁使用方式
//定义一个全局的锁,多线程共用一个互斥锁
pthread_mutex_t mymutex;
//在main函数中国初始化互斥锁
pthread_mutex_init(&mymutex,NULL);
//使用时申请锁
pthread_mutex_lock(&mymutex);
//使用完毕释放锁
pthread_mutex_unlock( &mymutex);
引入信号量的目的:多线程在访问临界资源时,按照一定的操作顺序来访问。
信号量是一个受保护的变量,只能通过三种操作来访问
1.初始化 sem_init()
2.P操作(申请资源)-1 sem_wait() sem_trywait() 在信号量大于零时,他们都能将信号量值减1。若信号量值为零时,阻塞线程。
3.V操作(释放资源)+1 sem_post() 将信号量的值加1,同时唤醒等待的线程。
- 定义两个信号量实现同步
sem_t sem1;
sem_t sem2;
- 初始化信号量参数
sen_init(&sem1,0,1);
sen_init(&sem2,0,0);
3. 使用信号量
4. 程序结束销毁信号量
sem_destroy(&sem1);
sem_destroy(&sem2);