Sebuah fungsi melakukan hal-hal pada variabel yang harus dilindungi terhadap utas bersamaan oleh mutex.
Pemanggil fungsi ini mengunci mutex, melakukan hal-hal lain dan memanggil fungsi ini.

Sekarang muncul situasi yang mengharuskan fungsi ini dipanggil dari potongan kode lain.
Tentu saja kode ini dapat mengunci mutex juga, tetapi saya pikir mungkin fungsinya dapat melihat apakah harus mengunci mutex atau tidak.

Yang saya perlukan adalah fungsi yang memberi tahu saya jika utas saat ini telah mengunci mutex. Kemudian fungsi bisa berjalan tanpa mengunci. Kalau tidak, itu akan mengunci.

int need_to_lock = !my_thread_has_locked_the_mutex(&mutex);

if (need_to_lock)
    mutex_lock(&mutex);

access variables;

if (need_to_lock)
    mutex_unlock(&mutex);

Apakah my_thread_has_locked_the_mutex ada? Saya tidak dapat menemukan apa pun.

Edit ke komentar

Saya tidak tahu tentang mutex rekursif. Mereka tampaknya melakukan apa yang saya pikirkan.
Apa yang saya gunakan sekarang adalah mutex tidak rekursif yang memblokir jika dikunci dua kali dari utas yang sama.

2
Droidum 27 Februari 2020, 15:59

1 menjawab

Jawaban Terbaik

Mengapa tidak menggunakan mutex rekursif saja? Mutex rekursif secara substansial mirip dengan mutex biasa, tetapi dapat dikunci beberapa kali oleh satu utas (yaitu secara rekursif).

Di beberapa perpustakaan, mutex bersifat rekursif secara default. Dengan c pthreads, Anda perlu memilih mutex rekursif dengan menginisialisasi mutex Anda dengan tepat:

pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(mutex, &attr);

Pendekatan lain adalah dengan membagi fungsi Anda menjadi dua varian: satu yang harus dipanggil dengan mutex ditahan, dan satu yang harus dipanggil tanpa mutex ditahan. Konvensi penamaan yang biasa adalah menambahkan _locked ke yang pertama, atau _unlocked ke yang terakhir. Fungsi tidak terkunci hanya mengunci mutex dan kemudian memanggil fungsi terkunci, jadi tidak akan ada duplikasi kode yang nyata di sini.

3
nneonneo 27 Februari 2020, 13:15