代码块和线程优先级

时间:2011-07-12 10:54:47

标签: c++

当我将代码放入块中时,如下所示:

    {
      f1();
      f2();
    }

是否保证CPU会相互调用这两个函数,而不管其他进程正在运行?

我问的原因是因为在我的情况下,f1对操作系统做了一些事情,然后f2依赖操作系统处于相同的状态才能正常工作。

如果没有,(我真的不认为它),是否有任何C ++结构可以帮助我做这样的事情?

另外,我将提供一些背景信息,说明在我的实际代码中正在做什么:

f1()实际上是一个在win32系统上生成顶级窗口的函数。 f2()是一个搜索最顶层窗口(不是任务栏)的函数。所以,我担心的是我可能遇到一个问题,其中可能在f1完成和f2尚未执行之间的时间内创建其他顶级窗口,在这种情况下f2将找到错误的窗口。

6 个答案:

答案 0 :(得分:5)

  

是否保证CPU会相互调用这两个函数,而不管其他进程正在运行?

是。如果这些函数产生线程或其他什么,它们可以以不同的顺序运行。但是这些函数的实际代码将按顺序执行。

如果您正在谈论访问过程中的任何内容,那就是另一回事了。 C和C ++,作为语言,没有并发概念等(在volatile之类的一些语言特性之外)。程序中的所有内容都是顺序的,但程序之外的世界是未知且不可知的(没有提供此类钩子的库)。

如果相关库没有提供阻止其他进程触及代码触及的某个全局状态的方法,那么您无法确定状态是否会在设置时保持设置。

答案 1 :(得分:3)

f2可以在f1之后直接运行而不是,因此f2应该 依赖于处于州内的系统f1让它进入。事实上,除非你有适当的锁定,否则它们都不应该在多线程系统上使用状态。

保证f1在调用f2之前返回。

答案 2 :(得分:1)

它总是以该顺序运行,但如果你有线程修改使用f1和f2的基础变量,你必须使用互斥锁来保护它们

答案 3 :(得分:1)

鉴于代码块原样并且没有发生外部问题,您可以保证只有在f1()终止后才会调用f2()。

答案 4 :(得分:1)

在f1之后将调用

f2。但是它们之间可能会发生某些事情(它也可能会改变操作系统状态)

答案 5 :(得分:0)

确保执行此操作的线程首先以f1结束,然后直接在该调用f2之后完成。但是,当您依赖于当前正在执行的线程(某些共享OS资源)之外的状态时,不能保证其他线程/进程/硬件将修改此资源,即使在执行这些方法中的任何一个时 < / em>的。然后,您需要某种锁来保护其他人访问的资源。当这样的锁跨越该块时,也保证它在后续调用之间不会改变。

根据您的操作系统和资源,可能会提供此类锁定。但是这个信息太少了。