PTHREAD_MUTEX_INITIALIZER - pthread_mutex_init (& mutex, param)


91

Arasında herhangi bir fark var mı

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

Veya

pthread_mutex_t lock;
pthread_mutex_init ( &lock, NULL);

Yalnızca ilk yöntemi kullanırsam yeterince güvende miyim?

NOT: Sorum çoğunlukla çok küçük programlarla ilgilidir, burada en çok yapacağım şey birkaç istemciyi bir sunucuya bağlamak ve sorgularını çalışan iş parçacıklarıyla çözmek.

Yanıtlar:


74

POSIX standardının eski sürümlerinde, bir başlatıcıya sahip ilk yöntemin, değişken autobir işlev gövdesinde tanımlanmış bir değişken olduğu zaman değil, yalnızca statik olarak ayrılmış değişkenlerle çalışması garanti edilir . autoDeğişkenler için bile buna izin verilmeyecek bir platform görmedim ve bu kısıtlama POSIX standardının en son sürümünde kaldırıldı.

staticÇok daha kolay önyükleme kodu yazmak için izin verdiği varyantı, sen izninizle gerçekten tercih edilir. Çalışma zamanında böyle bir muteks kullanan bir koda girdiğinizde, muteksin başlatıldığından emin olabilirsiniz. Bu, çok iş parçacıklı bağlamda değerli bir bilgidir.

Bir init işlevi kullanan yöntem, muteksiniz için özyinelemeli olma gibi özel özelliklere ihtiyaç duyduğunuzda veya yalnızca evreler arasında değil süreçler arasında paylaşılabilir olması gerektiğinde tercih edilir.


8

Dinamik başlatmayla muteksin daha fazla özniteliğini ayarlayabilir, ayrıca dinamik yöntemi yalnızca çalışma zamanında bir grup muteks ekliyorsanız kullanabilirsiniz.

Gerçi ihtiyaçlarınıza uyuyorsa, statik yaklaşımda yanlış bir şey yok.


" ayrıca dinamik yöntemi yalnızca çalışma zamanında bir grup muteks ekliyorsanız kullanabilirsiniz. " Peki, bu ne anlama geliyor? Açıklaması kolay değilse küçük bir örnek?
Kalec

1
@Kalec: Muteksiniz tarafından tahsis edilmişse malloc()(veya tahsis edilen bir nesneye aitse).
Michael Burr

3
@Kalec mutex değişkeni "kilit" bir yapının parçasıysa, 1. yaklaşımı izleyemeyiz. pthread_init () kullanmalıyız.
pankaj kushwaha

8

Bunu bu kitaptan alıntı yapmak istiyorum :

İle POSIXdişler, kilitleri başlatmak için iki yol vardır. Bunu yapmanın bir yolu PTHREAD_MUTEX_INITIALIZER, aşağıdaki gibi kullanmaktır : pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

Bunu yapmak, kilidi varsayılan değerlere ayarlar ve böylece kilidi kullanılabilir hale getirir. Bunu yapmanın dinamik yolu (yani çalışma zamanında) pthread_mutex_init()aşağıdaki gibi bir çağrı yapmaktır : int rc = pthread_mutex_init(&lock, NULL); assert(rc == 0); // always check success!

Bu rutinin ilk argümanı kilidin kendisinin adresidir, ikincisi ise isteğe bağlı bir öznitelikler kümesidir. Öznitelikler hakkında kendiniz daha fazlasını okuyun; NULL değerini geçmek varsayılanları kullanır. Her iki şekilde de çalışır , ancak genellikle dinamik (ikinci) yöntemi kullanırız.


5

Varsayılan muteks özniteliklerinin uygun olduğu durumlarda, muteksleri başlatmak için PTHREAD_MUTEX_INITIALIZER makrosu kullanılabilir.

Muteks için öznitelikler belirtmek istiyorsanız, dinamik başlatma ile gidin ........

Etki, herhangi bir hata kontrolünün gerçekleştirilmemesi dışında, parametrenin NULL olarak belirtildiği bir pthread_mutex_init () çağrısı ile dinamik başlatmaya eşdeğer olmalıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.