Unix学习(十一)

来源:互联网 发布:软件可行性研究 编辑:程序博客网 时间:2024/05/16 11:33

多线程
一般一个进程只有一条执行线索(线程),就是main函数。这也称为主线程。如果一个进程内部有多个任务需要并行工作,也可以自己来创建一些辅助线程。
库pthread
void* func(void* );
创建一个线程:pthread_create(pthread_t thread, pthread_attr, func, args);启动一个新线程执行func(args),把线程id保存在thread中。新线程和旧线程并行执行。
void** retval;
pthread_join(pthread_t, void** retval);
pthread_exit(void * ret)终止本线程
终止一个线程:pthread_cancel(threadid)请求终止线程
pthread_setcancelstate()有两个值可以允许可以不允许。state:PTHREAD_CANCEL_ENABLE, PTHREAD_CANCEL_DISABLE不允许被cancel终止。
int pthread_setcanceltype(int type, int* oldtype);type:PTHREAD_CANCEL_ASYNCHRONOUS在收到请求时立即终止,PTHREAD_CANCEL_DEFERRED在收到请求时执行到取消点时终止(取消点一般是io操作或者需要等待的操作)。
分离线程:pthread_detach(threadid)让一个线程结束后就直接丢弃线程信息不等待其他线程pthread_join。
-lpthread 或者 -pthread

线程同步
互斥量mutex类型pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;直接初始化一个互斥量
pthread_mutex_init(&m, NULL); // 初始化一个互斥量
pthread_mutex_destroy(&m); // 销毁一个互斥量
pthread_mutex_lock // 对一个互斥量加锁。如果互斥量已经加锁,函数会一直等待有线程把这个互斥量解锁之后再去加锁。如果不愿意等待可以用pthread_mutex_trylock.
pthread_mutex_unlock(&m) // 对一个互斥量解锁。哪个线程加的锁只能由那个线程解锁,别的线程不能解。

posix信号量:
semaphore.h
set_t s;
sem_init(&s, 0, n) 初始化一个信号量的值为n
sem_wait(&s); // 把计数器减1,如果不够减就等待,直到够减为止。
sem_post(&s); // 把计数器加1
sem_trywait(&s);// 把计数器减1
sem_destroy(&s);// 销毁信号量
信号量用于在多个线程之间同步。

条件变量Condition:多个线程等待某个条件满足,在条件达到时由一个线程去通知等待的线程。
pthread_cond_t
pthread_cond_init(&c, NULL)初始化一个条件变量
pthread_cond_destroy(&c)销毁一个条件变量
pthread_cond_signal(&c)通知一个在等待这个条件的线程,如果有多个线程在等待,只有其中一个得到通知;如果没有线程在等待,这个通知就作废丢弃。
pthread_cond_broadcast(&c)通知所有在等待这个条件地线程
pthread_cond_wait(&c)在一个条件变量上等待通知。条件变量总是要跟一个互斥量一起使用,在wait之前先把互斥量加锁。wait函数会自动把互斥量解锁进入等待状态,等到通知到达后结束等待状态又自动把互斥量加锁,然后wait函数才返回。
pthread_cond_timedwait(&c…)限时等待

进程线程区别
多进程适合粗粒度(coarse-grained)的多任务分块,多线程适合细粒度(fine-grained)的任务分块。
多进程占用的资源比较多,每个进程有自己的进程空间、进程状态(进程控制模块PCB)、进程id,内存时独立的,它们的通信需要使用专门的方式辅助通信。多线程占用的资源比较少,每个线程只是有自己的栈,内存时共用的,对公用资源的访问往往要考虑同步问题。
线程时轻量级的多任务,尽量用多线程。CPU调度以线程为单位。

网络通信:跨越计算机进行通信
协议(protocol):网络通信使用的约定
OSI网络模型,把网络划分成七层:
物理层:物理设备的协议
数据链路层:MAC地址寻址通信目标,广播
网络层:跨跃网络,IP地址来寻址
传输层:TCP,UDP传输控制
会话层:连接控制
表示层:数据表示格式
应用层:ftp,http,telnet,pop3,smtp

TCP/IP网络模型:实际使用中的网络通信协议模型
硬件和驱动:物理层、数据链路层
互联网层:网络层
传输层:传输层
应用层:会话层、表示层和应用层
套接字socket:操作系统提供的网络编程接口。
字节顺序问题:小段、大端,网络字节顺序
0x00000001 01 00 00 00 小端 低字节放在前面
字节顺序转换函数:
htons(unsigned short) 2字节的本机格式到网络格式
htonl(unsigned long)4字节的本机格式到网络格式
ntohs(unsigned short)2字节的网络格式到本机网络
ntohl(unsigned long)4字节的网络格式到本机格式

0 0