多个线程同时调用一个函数的情况

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多个线程同时调用一个函数的情况相关的知识,希望对你有一定的参考价值。

参考技术A 记录1:

函数里面要用到数据 ,如果数据属于性线程级别的(比如函数形参-->局部变量-->存在栈上--> 每个线程都有自己的栈 ),那么多线程同时调用是没关系的,因为用的都是本线程的数据;但是如果函数用到一些全局数据,比如全局变量,根据堆内存首地址去访问的堆内存(形参传入的),同时操作一个数据结构(如对一个链表的操作),静态局部变量,那就存在数据安全问题,必须要加锁对函数访问加锁。

1.线程中函数的调用:

每个进程都会有自己的虚拟地址空间,同一个进程中的每个线程都会在这个虚拟空间中,并被分配相应的资源。线程中的函数实体是在内存中,而函数中的局部变量则会一次被push到栈中。如果是A函数调用B函数,则会先将A函数的参数和局部变量push到队列中,再将B函数的参数和局部变量push到队列中。

2.两个线程调用同一个函数:

两个线程中的函数的局部变量由于是保存在不同的线程中,因此不需要进行互斥处理。

3.两个不同进程中的两个线程调用同一个处理函数:

同样,两个线程中的函数的局部变量由于是保存在不同的线程中,因此不需要进行互斥处理。

结论:

因此需要互斥处理的,一般是函数中有全局变量,有动态申请的空间,有静态局部变量,有需要进程数据循环发送之类的操作需要进行互斥处理。

多个线程调用同一个函数是不是安全?

【中文标题】多个线程调用同一个函数是不是安全?【英文标题】:Is it safe for multiple threads to call the same function?多个线程调用同一个函数是否安全? 【发布时间】:2010-07-05 05:05:00 【问题描述】:

例如这样做是否安全:

void AddTwo(int &num)

  num +=2;



void ThreadProc(lpvoid arg)

AddTwo((int)arg);


如果 4 个线程同时执行此操作是否安全?谢谢

【问题讨论】:

我只是举个例子,我知道这不是'正确' 【参考方案1】:

函数本身可以安全调用。如果他们都试图对同一个变量进行操作,那就很危险了。

【讨论】:

你的意思是一个变量不是被正确调用的函数的一部分,比如 AddTwo 修改了一个全局变量? 正确。我说的是地址“num”引用,而不是“num”本身。您尝试从多个线程修改全局变量的示例是问题案例之一。 好的,我的应用程序将分配工作,所以这应该不是问题,谢谢!【参考方案2】:

作为一般经验法则,如果函数不改变任何公共资源(例如相同的内存位置),则它是可重入的。如果是这样,您需要使用某种同步机制,例如互斥锁或信号量。

【讨论】:

【参考方案3】:

从不同线程调用同一个函数并没有错。如果你想确保你的变量是一致的,建议提供线程同步机制来防止崩溃、竞态条件。

【讨论】:

【参考方案4】:

安全取决于 lpvoid arg 的值。

如果所有 args 彼此不同,则安全,否则不安全。

要使函数调用安全,请查看“互斥锁”。

【讨论】:

【参考方案5】:

真正的答案是 - 这取决于...

在大多数平台上,是的,只要您不在其他人提到的功能中做任何不安全的事情,它就是安全的。很容易搞砸所以要小心!

在其他平台上,这绝对是不安全的。例如,由于硬件限制,大多数小型 PIC 微控制器的 C 编译器都不能支持这一点。

一般来说,是的,但它是安全的。

【讨论】:

以上是关于多个线程同时调用一个函数的情况的主要内容,如果未能解决你的问题,请参考以下文章

多个线程调用同一个函数是不是安全?

从 C++ 中的多个线程调用 Qt 中小部件类的信号函数是不是安全?

使用线程在python中调用多个c++函数

请问能够实现在UNIX下,一个进程下创建两个线程调用多个函数的问题

Qt入门教程QObject篇重入性和线程安全

Qt入门教程QObject篇重入性和线程安全