注:このアプローチを実際にテストする場合にのみ、この回答を正解としてマークしてください。
以下の構造体がロックフリーコンテナに安全に挿入および削除されるかどうかについての質問について:
struct person
{
string name;
uint32_t age;
}
冗長エンコーディングを使用すると、任意の長さのマルチバイトシーケンスをロックフリーコンテナに安全に挿入/削除できます。一度に4バイト(32ビット)を操作するためのアトミック命令がすでにあると仮定します。その場合、次のuint32_t age
ようにフィールドをエンコードできます。
struct age_t
{
uint32_t age_low;
uint32_t age_high;
}
このフィールドage_low
には、32ビットの下位ビット(たとえば、下位16ビット)が格納されますuint32_t age
。このフィールドage_high
には、残りの上位ビットが格納されます。概念的に:
struct age_t
{
uint16_t age_low;
uint16_t id_low;
uint16_t age_high;
uint16_t id_high;
}
フィールドid_low
とにid_high
は、ライターを識別するIDが含まれている必要があります。
読み取りは2つのアトミック32ビット読み取りとして実装され、すべてのid_
部分が互いに同等である場合に成功します。失敗した場合は、読み取り操作を再開する必要があります。
書き込みは2つのアトミック32ビット書き込みとして実装され、その後にage_t
値全体の読み取りが続きます。前の文で言及された読み取りが成功し、読み取られたIDが書き込まれたIDと同等である場合、書き込みは成功します。
価値についてstring
:原則は同じです。値が分割された方法と同様に、バイナリ値を分割する方法を理解する必要がありますage
。person
構造全体の読み取り/書き込みに関しても同じです。