今天研究下线程安全函数和非线程安全函数。什么是线程安全函数?我们知道在多线程编程中,线程安全问题是不容忽视的。只要存在多线程,就会存在多个线程访问同一段代码或者同一个全局变量的临界区,对于uc中标准函数也是一样(类似于windows中的原子函数)。当多个线程同时调用一个标准函数时,执行同一段代码,同样会在函数内部形成临界区,就可能出现问题。
        线程安全函数就是针对上述问题,在函数内部做了特殊的处理。用一句话总结:线程安全函数就是在多线程同时被调用时不会引发问题的函数,而非线程安全函数是在同时被调用时引发问题的函数。以一个函数为例,用来获取域名对应的ip信息的下面函数就是非线程安全函数:

struct hostent* gethostbyname(const char* hostname);

而其对应的线程安全函数是:

int gethostbyname_r(const char *name,
struct hostent *ret, char *buf, size_t buflen,
struct hostent **result, int *h_errnop);

线程安全函数的后缀名通常是_r,那么以后再多线程中我们就应该使用gethostbyname_r来代替gethostbyname?按理来说是这样,但是使用gethostbyname_r明显会带来较大的工作量。幸好,我们可以通过在声明头文件前声明一个宏_REENTRANT,使得我们在使用gethostbyname时,会自动被gethostbyname_t替代,也就是说像以下示例代码一样:

#define _REENTRANT
#include<stdio.h>
#include<pthread.h>
#include<netdb.h>
void* pthread_main(void* param)
{struct hostent* pent;char* name = (char*)param;pent=gethostbyname(name);printf("the ip is: %s \n",inet_ntoa(*((struct in_addr*)pent->h_addr_list[0])));
}
int main()
{int i=0;pthread_t pid[2];char* name1="localhost";char* name2="www.baidu.com";pthread_create(&pid[0],NULL,(void*)pthread_main,(void*)name1);pthread_create(&pid[1],NULL,(void*)pthread_main,(void*)name2);for(i=0;i<2;i++){pthread_join(pid[i],NULL);}return 0;
}

当然如果还觉得麻烦,不想在代码里面声明宏_REENTRANT,我们在进行编译程序时,把宏加上去也可:

gcc test.cpp -D_REENTRANT -lpthread

Github位置:
https://github.com/HymanLiuTS/NetDevelopment
克隆本项目:
git clone git@github.com:HymanLiuTS/NetDevelopment.git
获取本文源代码:
git checkout NL36

网络编程(36)—— 线程安全函数和非线程安全函数相关推荐

  1. java网络编程阻塞_Java网络编程由浅入深三 一文了解非阻塞通信的图文代码示例详解...

    本文详细介绍组成非阻塞通信的几大类:Buffer.Channel.Selector.SelectionKey 非阻塞通信的流程ServerSocketChannel通过open方法获取ServerSo ...

  2. php+linux+线程安全,转:PHP的线程安全ZTS与非线程(NTS)安全版本的区别

    原文来自于:http://blog.sina.com.cn/s/blog_94c21e8f0101s2ic.html Windows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和 ...

  3. C++的内联函数和非内联函数的区别

    一.内联函数和非内联函数的定义 1.内联函数 inline void test(); void test() { cout<<"test"<<endl; } ...

  4. Linux网络编程小知识(字节序、IP格式、函数、子网掩码、DNS域名解析代码实现)

    参考:网络编程前的一些小知识–Linux笔记 作者:一只青木呀 发布时间: 2021-04-12 23:19:10 网址:https://blog.csdn.net/weixin_45309916/a ...

  5. Linux Socket网络编程UDP、TCP 阻塞与非阻塞 断线重连机制

    三种非阻塞模式的方法: (1) fcntl函数 int Mode = fcntl(sockfd, F_GETFL, 0);       //获取文件的Mode值     fcntl(sockfd, F ...

  6. linux网络编程Internet Socket地址,套接字,和函数

    文章内容节选<linux/UNIX 系统网络编程> Internet domain socket地址有两种:IPv4 IPv6 IPv4被存储在结构体中, 该结构体在 netinet/in ...

  7. Java:代码验证 StringBuffer 线程安全,StringBuilder 非线程安全

    首先需要明白什么是线程安全,什么是非线程安全,引用百度百科  关于 Java 中 String,StringBuffer 和 StringBuilder 的区别,参看:  Java:String,St ...

  8. C++ const对象与非const对象的相互调用、const成员函数与非const成员函数的相互调用

    1)const对象可以调用非const成员函数吗? 答:不能.const修饰的对象实则修饰的是该对象的this指针,并且const修饰的成员不能进行修改,如果使用const调用非const成员函数,可 ...

  9. linux网络编程之用一张图片说明套接口常用函数

最新文章

  1. NLP 笔记: 序列标注与BIO标注
  2. at指令获取网络连接类型_【新手】ESP8266模块 AT指令详解
  3. 遇到指针别害怕!先把这篇笔记看一遍~
  4. redis可以存多少条数据_在银行存50万元,一年能有多少利息?不工作可以吗?...
  5. nssl1258-naive的瓶子【贪心】
  6. Linux学习之嵌入式Linux编程文件IO(C语言版)
  7. native html5 区别,H5与Native优劣对比
  8. linux禁用防火墙配置,CentOS Linux防火墙配置及关闭
  9. The Cow Lexicon(POJ-3267)
  10. python 分组箱线图_Python数据科学实践 | 绘图模块4
  11. 计算机中保留两位小数的表示方法,小数点的表示方法_计算机中表示带小数点的数有两种方法,...
  12. 2020 最新版《神经网络和深度学习》中文版.pdf
  13. Ubuntu20.04环境下samba无法被小米摄像头搜索到的解决方案
  14. Leetcode-01-Tow SUM
  15. 长USB线 CH340N 硬件调试——无法识别USB设备
  16. 思科ASA防火墙: 接口配置名称 安全等级 acl防控列表
  17. PyG利用GraphSAGE实现Cora、Citeseer、Pubmed引用论文节点分类
  18. 用计算机找到自己的另一半,心理专家教你,如何利用心理学找到自己的另一半?...
  19. 【产品经理】工作交接
  20. 计算机及信息技术应用领域,浅谈计算机信息技术的发展及应用

热门文章

  1. 京东 App 鸿蒙版上架华为应用商店
  2. python中circle是什么意思_啥是佩奇,让 Python 告诉你!
  3. java 做日历_java编程实现日历
  4. GDAL+OGR学习
  5. luogu1979 华容道
  6. Java 版本变更列表 (Java SE 8 ~ Java SE 18 )
  7. writely is cool!
  8. java基础做简单的医院管理系统,附带课程设计说明书
  9. 自我鉴定计算机专业大学,计算机专业大学生自我鉴定
  10. 如何解读微信表情图片的符号问题