Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果函数没有在线程内返回,如何保证函数不会再次输入?_C++_Winapi_Synchronization_Synchronous - Fatal编程技术网

C++ 如果函数没有在线程内返回,如何保证函数不会再次输入?

C++ 如果函数没有在线程内返回,如何保证函数不会再次输入?,c++,winapi,synchronization,synchronous,C++,Winapi,Synchronization,Synchronous,我不希望多个线程同时输入函数,也不希望在函数尚未返回时再次输入。有什么方法可以实现我的目标吗?多谢各位 这两个目标都可以通过互斥信号量实现。这两个目标都可以通过互斥信号量实现。通常,您需要引入监视器,例如在Java中,通过向方法签名添加“synchronized”关键字 (我说得对吗?通常,您需要引入监视器,例如在Java中,通过在方法签名中添加“synchronized”关键字 (我说得对吗?正如其他答案所解释的那样,在一个线程上执行函数时阻止其他线程输入该函数非常简单。但是如果你想在它已经被

我不希望多个线程同时输入函数,也不希望在函数尚未返回时再次输入。有什么方法可以实现我的目标吗?多谢各位

这两个目标都可以通过互斥信号量实现。

这两个目标都可以通过互斥信号量实现。

通常,您需要引入监视器,例如在Java中,通过向方法签名添加“synchronized”关键字


(我说得对吗?

通常,您需要引入监视器,例如在Java中,通过在方法签名中添加“synchronized”关键字


(我说得对吗?

正如其他答案所解释的那样,在一个线程上执行函数时阻止其他线程输入该函数非常简单。但是如果你想在它已经被输入的时候阻止它在同一个线程中。。。好吧,这是一个死锁。

正如其他答案所解释的,在一个线程上执行函数时阻止其他线程进入该函数非常简单。但是如果你想在它已经被输入的时候阻止它在同一个线程中。。。嗯,这是一个死锁。

您可以这样做:

int some_shared_var = 0;
...
for (;some_shared_var != rank;) ;
run_my_function();
some_shared_var++;
rank是您的线程编号(假设您有编号为0到大小为1的线程)


这只是一个例子。真正的实施将有所不同。这取决于要使用什么库/函数来并行化代码(fork、MPI等)。但我希望它能给你一些有用的想法。

你可以这样做:

int some_shared_var = 0;
...
for (;some_shared_var != rank;) ;
run_my_function();
some_shared_var++;
rank是您的线程编号(假设您有编号为0到大小为1的线程)


这只是一个例子。真正的实施将有所不同。这取决于要使用什么库/函数来并行化代码(fork、MPI等)。但是我希望它能给你一些有用的想法。

< P>因为你在说C++和Windows,看看。不过,您可能希望将它封装在几个C++类中,以便于使用。
如果已经锁定,关键部分尝试短时间旋转循环。对于短代码,这通常可以避免做完全阻塞等待,从而导致用户内核模式的开销等。

< P>因为您正在说C++和Windows,请看一下。不过,您可能希望将它封装在几个C++类中,以便于使用。 如果已经锁定,关键部分尝试短时间旋转循环。对于较短的代码段,这通常可以避免执行完全阻塞等待,从而避免用户内核模式等的开销。

使用关键部分(InitializeCriticalSection()、EnterCriticalSection()、LeaveCriticalSection())并实现入口计数器。临界段将防止来自不同线程的再入,入口计数器将防止来自同一线程的再入

要实现入口计数器,请使用一个公共变量(对于您的情况为布尔值)和一个括号类。一旦您已经进入临界部分(因此没有其他线程将并行执行相同的代码),请检查变量的值。如果声明功能已经输入-离开(首先释放关键部分,然后离开功能)。否则,构造将更改变量值的括号类实例。因此,下一次该线程进入函数时,它将检查变量,查看是否发生了重入并离开。离开函数后,方括号类的析构函数将变量更改为其原始值

明智的做法是将括号类用于关键部分条目和条目计数器更改,以便代码是异常安全的,所有操作都以必要的顺序执行,而不管您是在异常时还是在返回语句时如何离开函数。

使用关键部分(InitializeCriticalSection(),EnterCriticalSection(),LeaveCriticalSection()),并实现一个入口计数器。临界段将防止来自不同线程的再入,入口计数器将防止来自同一线程的再入

要实现入口计数器,请使用一个公共变量(对于您的情况为布尔值)和一个括号类。一旦您已经进入临界部分(因此没有其他线程将并行执行相同的代码),请检查变量的值。如果声明功能已经输入-离开(首先释放关键部分,然后离开功能)。否则,构造将更改变量值的括号类实例。因此,下一次该线程进入函数时,它将检查变量,查看是否发生了重入并离开。离开函数后,方括号类的析构函数将变量更改为其原始值


明智的做法是将括号类用于临界段输入和输入计数器更改,以便代码是异常安全的,所有操作都按必要的顺序执行,而不管您如何离开函数-在异常或在返回语句时。

f将仅被称为runs only,当没有其他人正在运行它时。 (这是仅使用Win32调用的概念演示)


注意最小检查、缺少互斥锁的清理代码以及首次输入时的竞争条件。

f将仅在当前没有其他人运行它时被称为runs only。 (这是仅使用Win32调用的概念演示)


注意最小检查、缺少互斥锁的清理代码和首次输入时的竞争条件。

如果不是虚拟机,那么是什么操作系统?哪个平台?或者你需要一个独立于平台的吗?你说的“我也不想在它还没有返回时再次输入”是什么意思?同理?只要线程没有从函数返回,它就不能再次进入(除非使用递归)…如果