2013-04-08 21 views
16

Kitaplığımda özel bir sınıfla std :: atomic kullanıyorum. Tüm MSVC ile çalışıyor, ama şimdi o MacOS çalışmasına almaya çalışıyorum ki ben bir bağlayıcı hatası alıyorum: mimari x86_64 içinstd :: atomic

tanımlanmamış sembolleri: "__atomic_store", başvurulan: Ana içinde _main.

o ben bu örnek çok mantıklı değildir tabii bu

#include <iostream> 
#include <atomic> 

using namespace std; 

class Vec { 
    public: 
    int x, y, z; 
    Vec() { x = y = z = 0; } 
}; 

std::atomic<Vec> x; 


int main() 
{ 
    Vec a; 
    x = a; 
    cin.get(); 
    return 0; 
} 

çoğaltmak için bazı test kodunu oluşturduk ama ben ile gelebilir en kısa var. VS2012'de çalışır, ancak xcode'ta değil (bana yukarıda gösterilen bağlayıcı hatası verir).

Peki neler oluyor? Std :: atomic'i burada mı kötüye kullandım? Üzerinde çalıştığım kütüphane çok iş parçacıklı ve ses işleme için kullanılıyor. Yani std :: atomic'i doğru şekilde kullanmıyorum, bu gerçekten göstermiyor çünkü performans çok iyi ve onunla ilgili herhangi bir sorun yok. Ya da belki bir şey eksik xcode nedir?

Güncelleme: 3 cevaplar yararlıdır rağmen, çoğu bilgiler çünkü andrey cevabını kontrol ettim

. Bu konuda uzman değilim (belli ki), fakat VS2012'nin C++ 11'de uygulanması gerekenleri aştığı görülüyor.

Peki buradan nasıl gidilir? Birkaç seçenek görüyorum.

  1. Bu sınıf için atomik kullanmayın. Benim özel durumumda bu çok zor olurdu çünkü benim vektör sınıfım kodun her yerinde kullanılıyor. Mutekslerin kilitlenmesi ve kilidinin açılması büyük olasılıkla işleri yavaşlatır.
  2. Atomik için işlevleri kendim uygula. Bu benim için çok karmaşık görünüyor. Son seçenek olarak kaydedeceğim.
  3. Boost :: atomic ile bir şey yapılıp yapılamayacağını görün. Bu ilk bakışta işe yarıyor gibi görünüyor. Bununla ilgili daha fazla test yapmak zorundayım. Standart kitaplık clang derleyici ayarlarında yılında proje sayfasında kullandığımız
+1

Otel sade desteklenmiyor olabilir. – GManNickG

cevap

7

http://en.cppreference.com/w/cpp/atomic/atomic açıklandığı gibi:

The standard library provides full specializations of the std::atomic template for the following types:

1) One specialization for the type bool and its typedef
2) Specializations and typedefs for integral types
3) std::atomic for all pointer types

Ne Boost.Atomichakkında. Boost.Atomic limitations açıklandığı gibi:

Using non-POD-classes as template parameter to atomic results in undefined behavior.

+5

'std :: atomic' türünün yalnızca önemsiz bir şekilde kopyalanabilmesini ve OP'de gösterilen sınıfın kolayca kopyalanabilmesini gerektiriyor. – bames53

+3

"Tam uzmanlıklar sağlar", diğer türlerin desteklenmediğini, yalnızca uzmanlıklarla uygulanmadıklarını ima etmez. Std :: atomic 'genel şablonu, genel olarak kopyalanabilen türleri işler. Sayısal türler için uzmanlaşmalar, isteğe bağlı kullanıcı tanımlı türler için geçerli olmayan ek üye işlevleri (aritmetik işlemler gibi) sağlar. –

+0

Ancak, bu, kurucu dışarıda kalsaydı, örnekle bağlantı kurması gerektiği anlamına gelmez mi? Bunu açıklarsam hala aynı hatayı alıyorum. – yvanvds

0

kontrol edin. GNU'nun C++ 11 desteği veya libC++ ile libstdC++ olması gerekir.

Yardım edersiniz.

+0

Teşekkürler. Bu ayarları kontrol etmek iyidir. Bu durumda, bu sorun değil, esas olarak bu ayarları xcode 4.6 – yvanvds

+0

standart görünüyor çünkü ben benim programım benim mac kontrol ve aynı hatayı aldım rağmen ... Hiçbir fikrim yok. Standart kitaplıktaki bir hataya benziyor veya desteklenmeyen özellik – inkooboo

İlgili konular