如何判断函数是多线程安全的

guess_method 2015-07-28 03:09:35
如何判断函数是多线程安全的
...全文
453 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-07-29
  • 打赏
  • 举报
回复
引用 7 楼 xiaohuh421 的回复:
我觉得总的一句话. 安全的函数内未使用函数作用域外的可变的数据和函数. 如果一个函数内部, 只使用了传值参数,内部只使用栈变量, 内部调用的也是线程安全的函数, 那么这个函数就是线程安全的. 有例, 请指正.
C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\rand.c
/***
*rand.c - random number generator
*
*       Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
*       defines rand(), srand() - random number generator
*
*******************************************************************************/

#include <cruntime.h>
#include <mtdll.h>
#include <stddef.h>
#include <stdlib.h>

/***
*void srand(seed) - seed the random number generator
*
*Purpose:
*       Seeds the random number generator with the int given.  Adapted from the
*       BASIC random number generator.
*
*Entry:
*       unsigned seed - seed to seed rand # generator with
*
*Exit:
*       None.
*
*Exceptions:
*
*******************************************************************************/

void __cdecl srand (
        unsigned int seed
        )
{
        _getptd()->_holdrand = (unsigned long)seed;
}


/***
*int rand() - returns a random number
*
*Purpose:
*       returns a pseudo-random number 0 through 32767.
*
*Entry:
*       None.
*
*Exit:
*       Returns a pseudo-random number 0 through 32767.
*
*Exceptions:
*
*******************************************************************************/

int __cdecl rand (
        void
        )
{
        _ptiddata ptd = _getptd();

        return( ((ptd->_holdrand = ptd->_holdrand * 214013L
            + 2531011L) >> 16) & 0x7fff );
}
xiaohuh421 2015-07-29
  • 打赏
  • 举报
回复
我觉得总的一句话. 安全的函数内未使用函数作用域外的可变的数据和函数. 如果一个函数内部, 只使用了传值参数,内部只使用栈变量, 内部调用的也是线程安全的函数, 那么这个函数就是线程安全的. 有例, 请指正.
heronism 2015-07-28
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
没用可能会引起冲突的全局变量, 没用可能会引起冲突的静态局部变量, 没用可能会引起冲突的外部资源。 或者 根据线程ID的不同: 使用全局变量数组中的不同元素, 使用静态局部变量数组中的不同元素, 使用外部资源数组中的不同元素。 或者 使用可能会引起冲突的全局变量加了锁, 使用可能会引起冲突的静态局部变量加了锁, 使用可能会引起冲突的外部资源加了锁。 欢迎楼下达人补充。
赵兄高见!
fly_dragon_fly 2015-07-28
  • 打赏
  • 举报
回复
自己加锁,走自己的路
赵4老师 2015-07-28
  • 打赏
  • 举报
回复
没用可能会引起冲突的全局变量, 没用可能会引起冲突的静态局部变量, 没用可能会引起冲突的外部资源。 或者 根据线程ID的不同: 使用全局变量数组中的不同元素, 使用静态局部变量数组中的不同元素, 使用外部资源数组中的不同元素。 或者 使用可能会引起冲突的全局变量加了锁, 使用可能会引起冲突的静态局部变量加了锁, 使用可能会引起冲突的外部资源加了锁。 欢迎楼下达人补充。
cobra_chen 2015-07-28
  • 打赏
  • 举报
回复
函数文档,函数实现。 写多线程代码测试(这个方法不太靠谱)。
Saleayas 2015-07-28
  • 打赏
  • 举报
回复
看函数的文档。
bear234 2015-07-28
  • 打赏
  • 举报
回复
你先在理论上知道什么是“不安全” 然后....... 用脑子判断...........

64,684

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧