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ğernanosleep()
, 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
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.
Nasıl SimpleMembership ve WebSecurity ...
Bir Flash tabanlı web sitesi hakkında ...
Bir ORM nedir ve nerede hakkında daha ...
Jenerik hakkında hoş, neden onları kul...
Jenerik hakkında bu kadar özel nedir.x...