【发布时间】:2017-07-31 12:04:21
【问题描述】:
我有关于编译器更改执行顺序的问题。我试图通过用信号机制(通过信号量)替换关键部分来提高多线程程序(C 语言)的性能。
这里我需要保证执行的顺序,并且一直在做一些研究。我看到很多关于函数内执行顺序的问题,但没有太多关于函数内函数的讨论。
基于https://en.wikipedia.org/wiki/Sequence_point 规则#4,下面的代码块是否保证必须在输入func2 之前首先评估*p->a,因为func2 将p 作为输入(假设编译器遵守此处定义的调度点规则)?
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闲置的。
【问题讨论】:
-
因为 p 不是原子的,所以:有效请求取决于是否设置了 p->b。 看起来很像数据竞赛。
-
如果您的编译器支持 C11,您可以使用原子,例如:线程 1 在 p->b 上执行存储释放,线程 2 在 p->b 上执行加载获取。
标签: c multithreading performance compiler-optimization