/*
达内学习 UC day36 2013-10-22
*/
回顾:
UDP时间服务器
线程- 原理,相关概念,API
操作系统支持多进程,每个进程内部支持多线程
每个进程都有一个主线程(main函数) 当主线程结束时,进程也随之结束,;进程结束所有线程结束
线程和线程之间乱码乱序,每个线程内部顺序执行,同一个进程内部的多线程 共享进程的资源,但每个线程但每个线程都有拥有一个独立的栈空间
多线程互相独立 又互相影响
线程的函数声明都在 pthread.h中,函数代码在libpthread.so中,线程相关的函数/结构都以pthread_开头,相关函数:
pthread_create(pthread_t* id,pthread_attr_t* attr,函数指针,函数参数)
pthread_join()(用于非分离状态) pthread_exit() pthread_self()
//=============================================================================================================================================
今天:
线程的状态 - 分离和非分离
线程的取消(了解)
线程的同步技术 -互斥量、信号量(线程计数器)、条件变量
死锁
线程创建以后可以设置状态:分离状态、非分离状态,区别是分离状态的线程运行结束以后立即回收资源,非分离状态要的功能pthread_join返回才回收资源,
分离状态可以用pthread_detach(pthread_t id) 设置。线程一旦被设置了分离状态,pthread_join()就无效。
为了保证线程资源及时回收,创建线程以后,最好调用pthread_join() 或者 pthread_detach()
线程取消
线程支持其他线程对自己的取消(非正常终止),但取消线程是不常用的,线程取消的相关函数
pthread_cancel() 取消线程
pthread_setcancelstate() 设置是否允许取消
pthread_setcanceltype() 设置取消的方式(立即取消,等待下一个取消点)
线程同步技术
在同一进程内部的多线程 共享资源(全局区、代码区、BSS段、堆)因此当多线程同时访问共享资源时,可能出现数据不一致和不完整,解决共享数据冲突问题的技术方案就是线程同步技术。
线程同步技术,核心思想就是把共享资源的访问,由并行改成串行。
注:线程同步技术,会降低代码的效率,不要进行没有必要的同步。
互斥量(互斥锁)就可以保证在执行某些代码时,只有一个线程能执行,其他线程被锁住
互斥量是POSIX规范中定义好的,因此有固定的使用步骤
1,定义互斥量(mutex)
pthread_mutex_t lock;
2, 初始化互斥量
phtread_mutex_init(&lock,0); 或者在声明的时候赋值, = PTHREAD——MUTEX——INITIALIZER;
3,加锁(加锁的部分只有一个线程能执行)
pthread_mutex_lock(&lock);
4, 执行锁定代码 (串行)
5,解锁,其他线程解除锁定
pthread_mutex_unlock(&lock);
6,释放互斥量资源
pthread_mutex_destroy(&lock);
信号量
信号量是一个计数器,,用来控制访问共享资源(临界资源)的线程的数量
信号量和互斥量不同,不是直接定义在pthread.h里面的 ,独立存在的 头文件semaphore.h
信号量和以前IPC的信号量集里面的信号量 不要弄混,没有直接关系
当信号量的初始计数为 1 时,效果等同于 互斥量。
信号量的使用步骤:
1 定义信号量 sem_t sem;
2 初始化信号量(设置初始值/最大计数) sem_init(&sem,0,value);
第二个参数 0 代表多线程,非 0 代表多进程,第三个参数为计数初始值,为1时相当于互斥量
3 获取一个计数(信号量减 1 ) sem_wait(&sem);
4 访问临界资源,执行代码
5 释放一个计数 (信号量加 1) sem_post(&sem);
6 销毁信号量 释放信号量资源 sem_destroy(&sem);
!!! //初始化函数写在main外面失败 不会执行
练习:信号量计数的用法,模拟数据库连接池
用信号量控制最大连接数为10,启动20个线程,每个线程的使用时间用sleep()模拟,休眠时间随机
如果线程B同时运行,有可能发生死锁,避免死锁的经验:
顺序上锁,反向解锁,不要回调
//====================================================================================
UC 常用知识点
1 共享库(动态库)的创建和调用
2 C语言的错误处理
3 C语言的指针 字符串 数组
4 unix/linux内存的分配和管理 (原理、进程的内存或分和函数)
malloc() free() mmap() munmap() brk() sbrk()
5 unix/Linux 文件管理(文件和目录)
读写文件、文件描述符、文件表、stat()、access()、truncate()、mkdir()、chdir()、remove()、去目录内容opendir()、readdir()、fcntl()取文件状态
6 进程的创建 fork()、vfork()+exec、wait()/waitpid()
7 信号 - 信号处理函数 signal() 、信号屏蔽sigprocmask()
8 IPC - XSI IPC:消息队列 信号量集 共享内存
9 网络编程 - sock编程
TCP模式 -socket()/sockaddr_in/bind()/listen()/accept()/connect()
UDP模式 -socket()/band()/sockaddr_in/recvfrom()/sendto()
10 线程开发 - 线程原理、pthread_create() pthread_join() pthread_detach()
线程同步技术:互斥 、 信号量