PTHREAD_MUTEX_INITIALIZER vs pthread_mutex_init (& mutex, param)

91

Apakah ada perbedaan antara

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

Atau

pthread_mutex_t lock;
pthread_mutex_init ( &lock, NULL);

Apakah saya cukup aman jika saya hanya menggunakan metode pertama?

CATATAN: Pertanyaan saya sebagian besar mengacu pada program yang sangat kecil di mana yang paling saya lakukan adalah menghubungkan beberapa klien ke server dan menyelesaikan pertanyaan mereka dengan utas pekerja.

Kalec
sumber

Jawaban:

74

Dengan versi standar POSIX yang lebih lama, metode pertama dengan penginisialisasi hanya dijamin untuk bekerja dengan variabel yang dialokasikan secara statis, bukan jika variabel tersebut adalah autovariabel yang ditentukan dalam badan fungsi. Meskipun saya belum pernah melihat platform di mana hal ini tidak diizinkan, bahkan untuk autovariabel, dan batasan ini telah dihapus dalam versi terbaru dari standar POSIX.

The staticvarian benar-benar lebih baik jika Anda dapat, karena memungkinkan untuk menulis kode bootstrap jauh lebih mudah. Kapanpun pada waktu proses Anda memasukkan kode yang menggunakan mutex seperti itu, Anda dapat yakin bahwa mutex tersebut diinisialisasi. Ini adalah informasi berharga dalam konteks multi-threading.

Metode yang menggunakan fungsi init lebih disukai ketika Anda memerlukan properti khusus untuk mutex Anda, seperti rekursif misalnya atau dapat dibagikan antar proses, tidak hanya di antara utas.

Jens Gustedt
sumber
8

Anda dapat mengatur lebih banyak atribut mutex dengan inisialisasi dinamis, ditambah Anda hanya dapat menggunakan metode dinamis jika Anda menambahkan sekumpulan mutex pada waktu proses.

Tidak ada yang salah dengan pendekatan statis, jika itu sesuai dengan kebutuhan Anda.

Joe
sumber
ditambah Anda hanya dapat menggunakan metode dinamis jika Anda menambahkan banyak mutex pada waktu proses. ” Jadi, apa artinya ini? Contoh kecil apakah tidak mudah dijelaskan?
Kalec
1
@Kalec: jika mutex Anda dialokasikan oleh malloc()(atau milik objek yang dialokasikan).
Michael Burr
3
@Kalec jika variabel mutex "kunci" adalah bagian dari suatu struktur, maka kita tidak dapat mengikuti pendekatan pertama. kita harus menggunakan pthread_init ().
pankaj kushwaha
8

Saya ingin mengutip ini dari buku ini :

Dengan POSIXutas, ada dua cara untuk menginisialisasi kunci. Salah satu cara untuk melakukannya adalah dengan menggunakan PTHREAD_MUTEX_INITIALIZER, sebagai berikut: pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

Melakukannya akan menyetel kunci ke nilai default dan dengan demikian membuat kunci dapat digunakan. Cara dinamis untuk melakukannya (yaitu, pada waktu proses) adalah dengan melakukan panggilan pthread_mutex_init()sebagai berikut: int rc = pthread_mutex_init(&lock, NULL); assert(rc == 0); // always check success!

Argumen pertama untuk rutinitas ini adalah alamat kunci itu sendiri, sedangkan yang kedua adalah kumpulan atribut opsional. Baca lebih lanjut tentang atribut itu sendiri; meneruskan NULL hanya menggunakan default. Cara mana pun berhasil , tetapi kami biasanya menggunakan metode dinamis (terakhir).

Mari202
sumber
5

Dalam kasus di mana atribut mutex default sesuai, makro PTHREAD_MUTEX_INITIALIZER dapat digunakan untuk menginisialisasi mutex.

Jika Anda ingin menentukan atribut untuk mutex, gunakan inisialisasi dinamis ........

Efeknya harus setara dengan inisialisasi dinamis dengan panggilan ke pthread_mutex_init () dengan parameter attrspecified sebagai NULL, kecuali bahwa tidak ada pemeriksaan kesalahan yang dilakukan.

Ramesh Miriyala
sumber