我有一个问题,关于编译器改变执行顺序的问题。我正在尝试通过用信号机制(通过信号量)替换临界区来提高多线程程序(C语言)的性能。
我需要保证这里的执行顺序,并且一直在进行一些研究。我看到了许多关于函数内部执行顺序的问题,但对于一个函数内部的函数没有太多的讨论。
基于“序列点”规则#4,以下代码块是否保证在进入func2之前先评估*p->a,因为func2将p作为输入(假设编译器遵守此处定义的调度点规则)?https://en.wikipedia.org/wiki/Sequence_point rules #4。
我需要保证这里的执行顺序,并且一直在进行一些研究。我看到了许多关于函数内部执行顺序的问题,但对于一个函数内部的函数没有太多的讨论。
基于“序列点”规则#4,以下代码块是否保证在进入func2之前先评估*p->a,因为func2将p作为输入(假设编译器遵守此处定义的调度点规则)?https://en.wikipedia.org/wiki/Sequence_point rules #4。
func1 (struct *p) {
p->a = x;
func2 (p);
}
func2 (struct *p) {
p->b = y;
releaseSemaphore(s);
}
非常关键的一点是,只有在设置了p->a
之后才能设置p->b
,因为另一个线程正在循环处理各种请求,并通过检查p->b
是否设置来确定有效请求。释放信号量只会在任务处于空闲状态(并等待信号量)时触发任务,但如果它正在忙于处理其他请求,则稍后会检查p->b
,我们无法保证仅在该线程处于空闲状态时调用func1
。