atoi多线程安全吗?

Cha*_*ori -7 c multithreading runtime-error atoi

我在创建多线程程序时遇到了一些错误.使用gdb进行调试时,atoi函数会抛出错误.请帮助,atoi多线程不安全,如果是,有哪些替代方案?

And*_*ing 6

atoi多线程安全吗?

是的,在atoi()的linux手册页中写道:

???????????????????????????????????????????????????????????
?Interface               ? Attribute     ? Value          ?
???????????????????????????????????????????????????????????
?atoi(), atol(), atoll() ? Thread safety ? MT-Safe locale ?
???????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

所以它只是使用从线程传递的变量(语言环境)并且完全是线程安全的(MT-Safe),只要你不传递相同的内存位置,例如指向char数组的指针,从两个线程到那个功能.

如果你这样做,两个函数调用(线程一和二)将使用相同的内存位置,在atoi()它没有那么糟糕的情况下,因为该函数只从内存中读取,请参阅参数const char* nptr.它是一个指向常量char数组的指针.


这里也是对术语/属性的解释.

MT-安全:

MT-Safe或线程安全功能可以在其他线程存在的情况下安全地调用.在MT-Safe中,MT代表Multi Thread.

区域:

locale使用locale注释的函数作为MT-Safety问题从locale对象读取而不进行任何形式的同步.使用与语言环境更改同时调用的语言环境注释的函数可能以与执行期间活动的任何语言环境不对应的方式运行,但其行为不可预测.


使用gdb进行调试时,atoi函数会抛出错误.

atoi()函数根本不提供任何错误信息,如果转换不成功则返回,0并且您不知道这可能是要转换的实际数字.此外,该atoi()功能根本没有扔!我使用一小部分C代码生成的以下输出,请参阅ideone在线:

atoi with "3"        to integer: +3
atoi with "    3   " to integer: +3
atoi with "   -3   " to integer: -3
atoi with "str 3   " to integer: +0
atoi with "str-3   " to integer: +0
atoi with "    3str" to integer: +3
atoi with "   -3str" to integer: -3
atoi with "str-3str" to integer: +0
Run Code Online (Sandbox Code Playgroud)

atoi()如果第一部分是忽略空格和第一个数字部分后面的字符的数字,则可以看到转换成功.如果有非数字字符首先它失败,return 0并没有丢.


您应该考虑使用,strtol()因为它可以检测范围溢出,在这种情况下设置errno.
您还可以获得一个end pointer显示消耗了多少字符的内容.如果该值是0转换必定有问题.这是线程安全的atoi().

我做了同样的输出strtol(),你可以在上面的ideone在线示例中看到它:

0: strtol with "3"         to integer: +3 | errno =  0, StartPtr = 0x7ffc47e9a140, EndPtr = 0x7ffc47e9a141, PtrDiff = 1
1: strtol with "    3   "  to integer: +3 | errno =  0, StartPtr = 0x7ffc47e9a130, EndPtr = 0x7ffc47e9a135, PtrDiff = 5
2: strtol with "   -3   "  to integer: -3 | errno =  0, StartPtr = 0x7ffc47e9a120, EndPtr = 0x7ffc47e9a125, PtrDiff = 5
3: strtol with "str 3   "  to integer: +0 | errno =  0, StartPtr = 0x7ffc47e9a110, EndPtr = 0x7ffc47e9a110, PtrDiff = 0 --> Error!
4: strtol with "str-3   "  to integer: +0 | errno =  0, StartPtr = 0x7ffc47e9a100, EndPtr = 0x7ffc47e9a100, PtrDiff = 0 --> Error!
5: strtol with "    3str"  to integer: +3 | errno =  0, StartPtr = 0x7ffc47e9a0f0, EndPtr = 0x7ffc47e9a0f5, PtrDiff = 5
6: strtol with "   -3str"  to integer: -3 | errno =  0, StartPtr = 0x7ffc47e9a0e0, EndPtr = 0x7ffc47e9a0e5, PtrDiff = 5
7: strtol with "str-3str"  to integer: +0 | errno =  0, StartPtr = 0x7ffc47e9a0d0, EndPtr = 0x7ffc47e9a0d0, PtrDiff = 0 --> Error!
8: strtol with "s-r-3str"  to integer: +0 | errno =  0, StartPtr = 0x7ffc47e9a0c0, EndPtr = 0x7ffc47e9a0c0, PtrDiff = 0 --> Error!
Run Code Online (Sandbox Code Playgroud)

在这个线程上:检测strtol失败,strtol()讨论了关于错误检测的正确用法.