Data global:

uint16_t global_buffer[128];

Utas 1:

uint16_t local_buffer[128];
while(true)
{
    ...
    if(data_ready)
        memcpy(global_buffer, local_buffer, sizeof(uint16_t)*128);
}

Utas 2:

void timer_handler()
{
    uint16_t value = global_buffer[10];
    //do something with value
}

Pertanyaan saya adalah apakah ini aman untuk dilakukan? Maksud saya, apakah dijamin bahwa value akan mendapatkan nilai lama atau nilai baru (jika utas 1 memcpy() terganggu oleh sakelar konteks)? Apakah mungkin memcpy terganggu setelah satu byte dari nilai 16-bit diperbarui tetapi bukan yang kedua. Dalam hal ini, value akan menjadi sampah.

Jika operasi memcpy hanya terganggu di antara blok dengan jumlah byte genap, saya pikir ini aman.

Platform: x86 & x86-64 saja (hanya prosesor Intel i7 atau yang lebih baru sebenarnya)
OS: Linux
Penyusun: gcc

3
Syam 22 Mei 2021, 10:09

1 menjawab

Jawaban Terbaik

Itu akan tergantung pada implementasi memcpy() - tidak ada jaminan. Bahkan jika Anda tahu implementasinya membuat ini aman, tidak bijaksana untuk mengandalkannya sehingga di semua versi dan platform kode atau pola ini dapat digunakan kembali.

Anda dapat menerapkan salinan 16 bit kata demi kata Anda sendiri dengan salinan kata yang Anda tahu atom. Bagaimana melakukan itu menjamin pertanyaan baru.

1
Clifford 22 Mei 2021, 07:17