2010-07-13 10 views
7

Yeniden giriş kodu yazılırken önerilen uygulamalarda bir re-entrancy guide geçiyordum.Yeniden giriş kodu için önerilen uygulamalar C, C++

Bu diğer başvuru kaynakları ve kaynaklar bu konuyu kapsamaktadır?

Bu sorunları denetlemek için hangi lint benzeri araçlar kullanılabilir?

+0

. Bu çok ince bir şey değil. Fonksiyon çağrısında geçmediğiniz verileri kullanmayın, fonksiyonda herhangi bir durumu saklamayın. –

+1

Bu kılavuzda, çok yönlü hatalar (aslında sinyal işleme örneklerinin gerçek reentranisi olsa da) çok iş parçacıklı bir tanımlamadan (muteksler ... merhaba kilitlenme) sadece düz bir tokluk (sigsuspend (& zeromask) 'a kadar çok sayıda hata vardır. Arayanızın bir sebepten dolayı devre dışı bıraktığı kesintileri işlemeye izin verdiniz, bunun yerine sigsuspend (& oldmask) 'ı deneyin. –

cevap

0

Kılavuz yeterlidir. başparmaklarının

Benim kişisel kural sadece 2 yeniden reentering kodu için şunlardır:

  1. sadece fonksiyonunda parametre olarak geçirilen yalnızca değerini kullanılan değer parametreleri, geçmek take. Herhangi bir global parametreyi veya işaretçiyi (performans veya depolama için) kullanmam gerekirse, ona erişimi kontrol etmek için bir mutex veya semafor kullanın.

+0

Karmaşık tiplere ihtiyacınız varsa, mümkünse bunları değişmez hale getirin – fmark

+0

Merhaba işaretçiyi daha ayrıntılı açıklayabilir misiniz? Ya da bana bu ifade ile ilgili bir şey işaret? – ttchong

+8

Hayır Hayır! Reentrancy! = Threading. Muteksler ve semaforlar, kurallara aykırı bir kodun kilitlenmesine ya da sessizce işlerini yapamaz ve veri bozulmasına yol açmaz. –

1

Gerçekten yok. Yeniden girmeyen kod yazılması genellikle yeniden girmekten daha zordur. Sadece bu basit kurallara uyun ve çok uyanık bir şey yapmaya çalışmayın ve iyi olacaksınız.

Yüksek performanslı sorunlar için genellikle yeniden girmeyen kod yazılır.

1
  • yerel değişkenler kullanıyor musunuz.
  • Statik yerlileri veya global değişkenleri kullanmayın, TLS bile yineleme/reentrancy konusunda size yardımcı olmaz.
  • Geri aramalar yapmadan önce tüm değişkeni geri yükleyin.
  • Geri aramaları yaparken kilitleri tutmayın. Eğer kesinlikle yapmanız gerekiyorsa (ve yine de bunu önlemek için bir yol aramaya devam edersem), kilidinizi daha önce saklayan iş parçacığına yeniden girmeye çalışırsanız ne olacağını bildiğinizden emin olun. En azından, bunun için sınamak zorundasınız, aksi halde kilitlenmeye bağlı olarak, kilitlenme veya kırık değişmezler (yani bozulma) alırsınız. bunlar arama görevi istifi üzerinde saklanan veya bu görevin özel değişkenlerdir sürece
0
  1. bir girintili fonksiyonu olmayan bir atom şekilde değişkenleri kullanamaz.
  2. Bir reentrant işlevi, reentrant olmayan diğer işlevleri çağırmayabilir.
  3. Bir reentrant işlevi, donanımı atomik olmayan bir şekilde kullanamaz.

Ref: Sayfa 462 [ RENESAS RX62N mikrodenetleyici kullanarak BİR GİRİŞ] [James M. Conrad] hemen hemen bilmeniz gereken her şeye sahiptir rehberlik