SORU
21 EYLÜL 2012, Cuma


Hakkında _GLİBCXX_USE_NANOSLEEP nedir?

Basit bir makro _GLİBCXX_USE_NANOSLEEP adlı iki standart başlık dosyaları görünür:

  • c /4.7.1/x86_64-unknown-linux-gnu c/bit/config.h
  • c /4.7.1/thread

Varsayılan GCC 4.7.1, 64-bit Linux () yapı tek şeyc config.hbu yorum içerir:

/* Defined if nanosleep is available. */
/* #undef _GLIBCXX_USE_NANOSLEEP */

Oysaiplik, std::this_thread::sleep_for() std::this_thread::sleep_until() tanımı makro ataması bağlıdır. Eğer tanımlı değil ise, her iki işlevi-C tarafından gerekli Standart-tanımlı ya da olmayacak.

Benim sistem (glibc 2.15), makro nanosleep() işlevi (ctime ilan mevcut olmakla birlikte tanımlı değil ve çalışır durumda.

Bu tüm hakkında ne olduğunu ve onunla nasıl başa çıkılacağını bilmek istiyorum. Özellikle:

  • GCC this post tarafından önerilen varsayılan olarak bu makroyu etkinleştirmek için oluştururken kullanılması gereken bir yapılandırma seçeneği var mı? (Herhangi bir*.* 40) bulamadım
  • Gerçekten nanosleep() fonksiyon ve makro arasında bir ilişki var mı? ctime/time.h nanosleep() Bildirgesi bağlı, veya, makro tanımlamak için görünmüyor.
  • Herhangi bir spesifik risk komut satırı this related question önerilen () -D bir seçenek olarak kendi başlık dosyaları, veya makro tanımlamanın var mı? Eğer nanosleep(), ve aslında nasıl öğrenebilirim olmadığı bir sistemde bunu yaparsam ne olur?

GüncellemeGCC 4.8 itibaren std::this_thread::sleep_for() ve benzeri için destek otomatik olarak libstdc dahildir . Hiçbir yapılandırma bayrak daha fazla gereklidir. the GCC 4.8 change log:

this_thread::sleep_for(), this_thread::sleep_until() ve this_thread::verim() yapılandırma seçeneği-libstdcxx-zaman etkinleştirin; . --gerektirmeden tanımlanır

Ama GCC 4.8 için bu konuda daha fazla detayı Not ve 4.9 Jonathan'ın cevap verildi.

CEVAP
18 EKİM 2012, PERŞEMBE


Libstdc oluşturulduğunda configure script özellikleri desteklenir ve tanımlar sonuçlarına göre (veya tanımsız hale getirir) c config.h Çeşitli makrolar için sistem testleri

Sizin durumunuzda configure nanosleep() POSIX işlevi kullanılamaz ve makro tanımlı olmadığına hükmetti. Ancak dediğiniz gibi, 4**sisteminizde mevcut. Bu yüzden etkin değil configure çekler için bile çalıştırmak sürece kullandığınız --enable-libstdcxx-time seçeneği (belgelenen Configuration chapter of the libstdc manual, GCC yapılandırmak docs)

  • GCC bu post tarafından önerilen varsayılan olarak bu makroyu etkinleştirmek için oluştururken kullanılması gereken bir yapılandırma seçeneği var mı? (İnşa sürecinin çevrimiçi belgelerinde herhangi bir şey bulamadım.)

Evet, --enable-libstdcxx-time

  • Gerçekten nanosleep arasında bir ilişki() fonksiyonu ve makro? Nanosleep Bildirgesi() ctime.h bağlı, veya, makro tanımlamak için görünmüyor.

Abone olarak giriş fonksiyonu ilanı libstdc ', s makro. bağlı değil Ama makro işlevi kullanmak için olsun ya da olmasın libstdc söyler.

  • Herhangi bir spesifik risk kendi üstbilgi dosyaları makro tanımlamanın var, ya da komut satırında-D seçeneği bu soru ile ilgili olarak önerilen ()? Eğer bir sistemde böyle yaparsam ne nerede nanosleep() mevcut, ve aslında nasıl öğrenebilirim?

Yaramaz ve desteklenmiyor, ama çalışacak. Makro kullanıcı tarafından konfigüre tarafından belirlenen iç uygulama ve uygulama içi makro tanımı değişen bir şeyleri kırar. Ama olmaz bu durumda buna bağlı tek bir kod Başlığı olduğu için, libstdc .so hiçbir kütüphane kod etkilenir.

Ama daha iyi GCC yeniden --enable-libstdcxx-time seçeneği kullanmak için olurdu, ya da eğer bu mümkün değilse doğru makro tanımlamak için ** 10 düzenleyin.

nanosleep() müsait değil farklı bir sistem üzerinde tanımlarsanız 12 ** ne zaman bir derleme hatası alırsınız.

nanosleep() sched_yield() işaretli olacak, böylece yapılandırma geliştirmek için ideas bazıları bende de var, ama henüz onları üzerinde çalışmak için zamanım olmadı.

Güncelleme:Ben işlemediğini bazı değişiklikler böylece bina GCC 4.8 olmadan --enable-libstdcxx-time yine de tanımlamak std::this_thread::yield() (no-op) ve uygularlar std::this_thread::sleep_for() std::this_thread::sleep_until() kullanarak düşük çözünürlüklü ::sleep() ::usleep() işlevleri yerine ::nanosleep(). Hala daha iyi --enable-libstdcxx-time ama tanımlamak için.

Başka bir güncelleme:GCC 4.9.0 ve otomatik olarak onları desteklemek için bilinen platformlarda nanosleep sched_yield etkinleştirme varsayılan şimdi. Artık --enable-libstdcxx-time kullanmak için herhangi bir ihtiyaç vardır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CaliforniaMetin

    CaliforniaMe

    3 ŞUBAT 2013
  • Makeup Lover

    Makeup Lover

    12 HAZİRAN 2011
  • The Onion

    The Onion

    14 Mart 2006