网络编程(36)—— 线程安全函数和非线程安全函数
今天研究下线程安全函数和非线程安全函数。什么是线程安全函数?我们知道在多线程编程中,线程安全问题是不容忽视的。只要存在多线程,就会存在多个线程访问同一段代码或者同一个全局变量的临界区,对于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)—— 线程安全函数和非线程安全函数相关推荐
- java网络编程阻塞_Java网络编程由浅入深三 一文了解非阻塞通信的图文代码示例详解...
本文详细介绍组成非阻塞通信的几大类:Buffer.Channel.Selector.SelectionKey 非阻塞通信的流程ServerSocketChannel通过open方法获取ServerSo ...
- php+linux+线程安全,转:PHP的线程安全ZTS与非线程(NTS)安全版本的区别
原文来自于:http://blog.sina.com.cn/s/blog_94c21e8f0101s2ic.html Windows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和 ...
- C++的内联函数和非内联函数的区别
一.内联函数和非内联函数的定义 1.内联函数 inline void test(); void test() { cout<<"test"<<endl; } ...
- Linux网络编程小知识(字节序、IP格式、函数、子网掩码、DNS域名解析代码实现)
参考:网络编程前的一些小知识–Linux笔记 作者:一只青木呀 发布时间: 2021-04-12 23:19:10 网址:https://blog.csdn.net/weixin_45309916/a ...
- Linux Socket网络编程UDP、TCP 阻塞与非阻塞 断线重连机制
三种非阻塞模式的方法: (1) fcntl函数 int Mode = fcntl(sockfd, F_GETFL, 0); //获取文件的Mode值 fcntl(sockfd, F ...
- linux网络编程Internet Socket地址,套接字,和函数
文章内容节选<linux/UNIX 系统网络编程> Internet domain socket地址有两种:IPv4 IPv6 IPv4被存储在结构体中, 该结构体在 netinet/in ...
- Java:代码验证 StringBuffer 线程安全,StringBuilder 非线程安全
首先需要明白什么是线程安全,什么是非线程安全,引用百度百科 关于 Java 中 String,StringBuffer 和 StringBuilder 的区别,参看: Java:String,St ...
- C++ const对象与非const对象的相互调用、const成员函数与非const成员函数的相互调用
1)const对象可以调用非const成员函数吗? 答:不能.const修饰的对象实则修饰的是该对象的this指针,并且const修饰的成员不能进行修改,如果使用const调用非const成员函数,可 ...
- linux网络编程之用一张图片说明套接口常用函数
最新文章
- NLP 笔记: 序列标注与BIO标注
- at指令获取网络连接类型_【新手】ESP8266模块 AT指令详解
- 遇到指针别害怕!先把这篇笔记看一遍~
- redis可以存多少条数据_在银行存50万元,一年能有多少利息?不工作可以吗?...
- nssl1258-naive的瓶子【贪心】
- Linux学习之嵌入式Linux编程文件IO(C语言版)
- native html5 区别,H5与Native优劣对比
- linux禁用防火墙配置,CentOS Linux防火墙配置及关闭
- The Cow Lexicon(POJ-3267)
- python 分组箱线图_Python数据科学实践 | 绘图模块4
- 计算机中保留两位小数的表示方法,小数点的表示方法_计算机中表示带小数点的数有两种方法,...
- 2020 最新版《神经网络和深度学习》中文版.pdf
- Ubuntu20.04环境下samba无法被小米摄像头搜索到的解决方案
- Leetcode-01-Tow SUM
- 长USB线 CH340N 硬件调试——无法识别USB设备
- 思科ASA防火墙: 接口配置名称 安全等级 acl防控列表
- PyG利用GraphSAGE实现Cora、Citeseer、Pubmed引用论文节点分类
- 用计算机找到自己的另一半,心理专家教你,如何利用心理学找到自己的另一半?...
- 【产品经理】工作交接
- 计算机及信息技术应用领域,浅谈计算机信息技术的发展及应用