【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
linux下面由多进程和多线程两种编程方法。多进程比较健壮,但是数据通讯比较麻烦。多线程使用上更简单一些,数据通讯也很方便,因为数据空间本来就是共享在一起的。相比较多进程,多线程的最大缺点就是一旦一个线程发生了coredump,其他线程都会停止运行。
1、pthread支持所有的unix、linux系统
目前pthread编写的代码可以轻松在mac、ubuntu等os上运行。
2、pthread目前以nptl实现方式为主
不管是嵌入式linux、还是桌面系统,pthread的实现基本以nptl为主。
这种方法最大的好处,就是让kernel本身来实现thread的调度。
3、pthread可以看成是轻量级的process
因为linux系统本身不支持多线程,所以pthread其实是按照轻量级的process来设计的。
按照这个思路去考虑pthread,编写代码遇到signal、mutex、wait等问题就知道方法了。
4、关于pthread下信号的处理方法
尽量让一个thread处理所有的signal,其他thread用数据进行同步。
5、pthread代码的实现方法
可以参考uclibc下libpthread的实现方法。
6、pthread的创建方法
pthread_create-> create_thread-> do_clone-> syscall
其中新线程的返回函数是start_thread
7、新线程的启动流程
start_thread-> thread_func,多线程不会像多进程一样继续执行后面的代码
8、多线程的调试
gdb是调试多线程最好的工具
9、复现多线程死锁的方法
在多线程加锁的同时,sleep几秒钟即可,增加复现的机会
10、如果希望某些数据在thread下面,可以人手一份,那么可以添加__thread关键字
这也是一种tls技术的使用方法
#include
#include
#include
#include
__thread int var = 0;
void* worker(void* arg);
void* worker(void* arg){
int idx = (int)arg;
int i;
for (i = 0; i < 100; ++i) {
printf("thread:%d ++var = %d\n", idx, ++var);
}
return NULL;
}
int main(){
pthread_t pid1,pid2;
pthread_create(&pid1,NULL,worker,(void *)0);
pthread_create(&pid2,NULL,worker,(void *)1);
pthread_join(pid1,NULL);
pthread_join(pid2,NULL);
return 0;
}
ps:
a,多线程不是万能的,如果程序本身cpu占有率已经很高,那么多线程没有意义
b,多线程可以最大限度地使用多核硬件
c,多线程最好在系统和框架层面进行设计,如果业务面接触过多,容易发生各种问题