pthread_cond_init,隨想錄(關于pthread的使用方法)

 2023-10-08 阅读 23 评论 0

摘要:【 聲明:版權所有,歡迎轉載,請勿用于商業用途。 聯系信箱:feixiaoxing @163.com】 pthread_cond_init?? ? linux下面由多進程和多線程兩種編程方法。多進程比較健壯,但是數據通訊比較麻煩。多線程使用上更簡單一些,數據通訊也

【 聲明:版權所有,歡迎轉載,請勿用于商業用途。 聯系信箱: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,多線程最好在系統和框架層面進行設計,如果業務面接觸過多,容易發生各種問題


版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/128628.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息