随想录(关于pthread的使用方法)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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,多线程最好在系统和框架层面进行设计,如果业务面接触过多,容易发生各种问题


你可能感兴趣的:(随想录(关于pthread的使用方法))