【 聲明:版權所有,歡迎轉載,請勿用于商業用途。 聯系信箱:feixiaoxing @163.com】
pthread_cond_init?? ? linux下面由多進程和多線程兩種編程方法。多進程比較健壯,但是數據通訊比較麻煩。多線程使用上更簡單一些,數據通訊也很方便,因為數據空間本來就是共享在一起的。相比較多進程,多線程的最大缺點就是一旦一個線程發生了coredump,其他線程都會停止運行。
1、pthread支持所有的unix、linux系統
pthread_yield?? ? 目前pthread編寫的代碼可以輕松在mac、ubuntu等os上運行。
2、pthread目前以nptl實現方式為主
pthread和thread的區別。? ? 不管是嵌入式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 <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>__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,多線程最好在系統和框架層面進行設計,如果業務面接觸過多,容易發生各種問題
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态