seqlock - problem/problem. Lista 6.

Link z listy zadań.

I to trochę dla mnie nie ma sensu. Przykład:
W - wątek piszący, R wątek czytający

  1. Licznik seqlock = 5
  2. W wchodzi do sekcji krytycznej by coś pisać. (seqlock = 6)
  3. R wchodzi do sekcji krytycznej żeby coś przeczytać. (zapisuje old_seqlock = 6)
  4. R wychodzi z sekcji krytycznej (bo seqlock == old_seqlock)
  5. W wychodzi z sekcji krytycznej (seqlock = 7)

Mogło by się zdarzyć, że R przeczyta połowę danych przed pisaniem W i połowę po pisaniu W. Takie zdarzenie jest niesatysfakcjonujące z tego co rozumiem. Pewnie się mylę, więc pomocy.

Z https://en.wikipedia.org/wiki/Seqlock:

If the sequence number is odd on either occasion, a writer had taken the lock while the data was being read and it may have changed.

Reader nie powinien wchodzić do sekcji krytycznej jeśli seqlock jest nieparzysty, chociaż w Twoim źródle tego nie ma. Poza tym sytuacja z Twojego przykładu jest niemożliwa bo przed zajęciem spinlocka seqlock nie może być nieparzysty (zakładając że seqlock zaczyna się od 0)

Jednak w Twoim źródle też coś jest

If the initial value of the counter which is obtained from read_seqbegin() function is odd, this means that a writer was in the middle of updating the data when our reader began to act. In this case the value of the data can be in inconsistent state, so we need to try to read it again.

1 polubienie

To nie jest moje źródło, tylko link z listy od Cahira :stuck_out_tongue: . Dzięki.