実行順序を変更するコンパイラに関する質問があります。私は、マルチスレッドプログラム(C言語)のパフォーマンスを改善するために、重要なセクションをシグナリングメカニズム(厳しいセマフォ)に置き換えようとしています。揮発性またはメモリバリアとロックを使用せずに実行順序を保証する
私はここで実行の順序を保証する必要があり、これについていくつかの調査を行っています。関数内での実行順序については多くの質問がありましたが、関数内の関数についての議論はあまりありませんでした。 https://en.wikipedia.org/wiki/Sequence_pointルール#4に基づい
、以下のコードチャンクは、コンパイラを想定入力(ここで定義されたスケジュール・ポイントのルールに付着ようfunc2
がp
がかかるため*p->a
がfunc2
前に最初に評価されなければならないが入力されることを保証するであろう)?
func1 (struct *p) {
p->a = x;
func2 (p);
}
func2 (struct *p) {
p->b = y;
releaseSemaphore(s);
}
はp->b
が別のスレッドは、様々な要求を処理するループ内にあり、p->b
が設定されているかどうかによって、有効な要求を識別するようp->a
が設定された後にのみ設定されていることが重要です。解放セマフォは、アイドル状態(セマフォ待ち状態)のタスクのみをトリガしますが、他の要求を処理中の場合はp->b
をチェックし、そのスレッドがアイドル状態のときにのみ呼び出されることを保証することはできません。
pは原子ではないので、*別のスレッドがさまざまな要求を処理しているときにp-> aが設定された後にのみp> bが設定され、p-> bは設定されています*データレースのように見えます。 – 2501
コンパイラがC11をサポートしている場合、アトミックを使用することができます。たとえば、スレッド1はp> bでstore-releaseを行い、スレッド2はp-> bでロードを取得します。 – ninjalj