6.27.1.4 Hardware operations for multi-tasking

アトミックなハードウェア操作は、 他のタスクが中間状態を参照することなく、 操作全体を実行します。 これらの操作は、 遅い OS プリミティブを使用せずにタスクを同期するために使用できますが、 非アトミックな操作シーケンスと比較すると遅くなる傾向があります。 アトミックな操作は、 アライメントを必要としないハードウェアであっても、 アライメントされたアドレスでのみ正しく機能します。

!@ ( u1 a-addr – u2 ) gforth-experimental “store-fetch”

a-addr から 値を u2 に取得し、 そして、 a-addr に 値 u1 を格納する操作を、 アトミック操作として行います。

+!@ ( u1 a-addr – u2 ) gforth-experimental “add-store-fetch”

a-addr から 値 u2 を取得し、 a-addr の値に u1 を足し込む操作を、 アトミック操作として行います。

?!@ ( unew uold a-addr – uprev ) gforth-experimental “question-store-fetch”

a-addr から取得した値と uold を比較し、 等しい場合はunewa-addr に格納して uprev には uold をセットします。 等しくない場合は a-addr への格納は行わずに a-addr から取得した値を uprev にセットします。 これらの操作をアトミック操作として行います。

もう 1 つのハードウェア操作はメモリー・バリアーです(memory barrier)。 残念ながら、 最新のハードウェアでは、 メモリー操作を他のメモリー操作と比較して(別のコアから見た場合に)並べ替えることができることが多く、 メモリー・バリアーにより、 タスク実行のある時点でこの並べ替えを抑制します。

barrier ( ) gforth-experimental “barrier”

バリアー前のすべてのメモリー操作は、 バリアー後のメモリー操作より前に実行されます。