首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从另一个函数中的任意位置调用C函数?

如何从另一个函数中的任意位置调用C函数?
EN

Stack Overflow用户
提问于 2009-12-11 05:10:20
回答 5查看 529关注 0票数 1

有人能告诉我如何在C函数中的任意位置插入函数调用(比如),这样每次运行代码时,都会从代码的不同部分调用Yield()吗?

我面临这样的需求,因为我在协作线程环境中使用两个线程,除非正在运行的线程显式地生成处理器,否则另一个(等待)线程无法开始运行。我不想将Yield()调用放在一个点上,因为这使得线程序列具有确定性。在不重新连接整个环境(从协作到抢占)的情况下,这是我所能想到的唯一解决方案,Thread_1()可以在其中任意位置执行Yield()调用,从而允许Thread_2()接管。

任何对不同解决方案实现相同目标的见解都是值得欢迎的!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-12-11 05:20:43

我认为需要一个BFI解决方案。

我认为你必须用显而易见的方法解决这个问题。您需要为Yield()做一个包装器,对是否调用真实的东西做出“随机”的决定。

如果您不关心执行速度,那么我将使它成为一个真正的C函数,如果您关心的话,我可能会建议一个预处理器宏。

所以,就像:

代码语言:javascript
复制
#define Yield0() ((random() & 0xf) == 0 && Yield())

选择您想要的呼叫百分比的掩码。对于0xf,如果random()具有良好的低阶位随机性,那么您将在16个调用中看到一个产生()。如果您可以使用MT或其他高质量的随机数生成器,则低阶位将直接有用,否则您可能需要random() >> 3 & ...

您只需要将Yield0()调用放到任何地方。

票数 3
EN

Stack Overflow用户

发布于 2009-12-11 05:22:30

我会定义一个函数,类似于:

代码语言:javascript
复制
void maybe_yield() { 
    if (rand() & 0x10)
        yield();
}

然后在代码中分散对maybe_yield()的调用。根据您希望调用产量的频率,您可以将0x10更改为一个常量,设置更多位以使yield()更频繁地被调用。除此之外,一定要使用一个值调用srand(),该值从一次运行更改为下一次运行,以获得不同运行时的不同序列。

票数 2
EN

Stack Overflow用户

发布于 2009-12-11 05:26:20

实际上,当您在协同运行的线程环境中运行时,您确实需要决定论。

但是,如果你下地狱的决心去做,你只需要把它随机化。

代码语言:javascript
复制
#include <stdlib.h>
// And make sure you seed the generator with srand() somewhere.
#define YIELD_CHANCE 15

#define yield Yield
#ifdef YIELD_CHANCE
    #if YIELD_CHANCE > 0
        #if YIELD_CHANCE <= 100
            #undef yield
            void yield(void) {
                if (rand() < (RAND_MAX / (100/YIELD_CHANCE)))
                    Yield();
                }
        #endif
    #endif
#endif

然后将Yield调用更改为yield,并根据编译时将YIELD_CHANCE设置为哪个值,您将得到确定性或非确定性行为。

如果它不存在或超出了1到100的范围,yield将一直产生。如果它在这个范围内,那么它将随机调用Yield函数,根据你给它的概率。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1885903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档