SORU
3 ŞUBAT 2012, Cuma


::shared_ptr std iş parçacığı güvenliği açıkladı

http://gcc.gnu.org/onlinedocs/libstdc /manual/shared_ptr.html ve bazı iş parçacığı güvenlik sorunları benim için hala net değil okuyorum:

  1. Standart referans sayım iş parçacığı güvenli işleneceğini garanti ve platform bağımsız, değil mi?
  2. Benzer sorunu yalnızca bir iş parçacığının (son başvuru holding) paylaşılan nesne sil çağıracak standart garanti, değil mi?
  3. shared_ptr nesnesi için herhangi bir iş parçacığı güvenliği içinde saklı garanti etmez?

DÜZENLEME:

Kod Pseudo:

// Thread I
shared_ptr<A> a (new A (1));

// Thread II
shared_ptr<A> b (a);

// Thread III
shared_ptr<A> c (a);

// Thread IV
shared_ptr<A> d (a);

d.reset (new A (10));

IV sınıf ilk iş parçacığı oluşturulan önceki örneğini silmek ve yeni bir örnek ile yerini alacak konu? reset arıyor() Reset çağrıldıktan sonra dahası() IV parçacığı başka bir iş parçacığı, yalnızca yeni oluşturulan nesne görecek mi?

CEVAP
30 Kasım 2012, Cuma


Diğerleri belirttiği gibi, dışarı doğru orijinal 3 sorunlara ilişkin karar var.

Ama senin bir parçası Düzenle biten

IV sınıf ilk iş parçacığı oluşturulan önceki örneğini silmek ve yeni bir örnek ile yerini alacak konu? reset arıyor() Reset çağrıldıktan sonra dahası() IV parçacığı başka bir iş parçacığı, yalnızca yeni oluşturulan nesne görecek mi?

yanlıştır. Sadece d* *4 ve a, b c orijinal işaret devam eder yeni işaret eder A(1). Bu açıkça şu kısa örnekte görülebilir.

#include <memory>
#include <iostream>
using namespace std;

struct A
{
  int a;
  A(int a) : a(a) {}
};

int main(int argc, char **argv)
{
  shared_ptr<A> a(new A(1));
  shared_ptr<A> b(a), c(a), d(a);

  cout << "a: " << a->a << "\tb: " << b->a
     << "\tc: " << c->a << "\td: " << d->a << endl;

  d.reset(new A(10));

  cout << "a: " << a->a << "\tb: " << b->a
     << "\tc: " << c->a << "\td: " << d->a << endl;

  return 0;                                                                                                          
}

(Açıkça, herhangi bir iş parçacığı etmedim: shared_ptr::reset() davranış içine faktör değildir.)

Bu kod çıktı

a: 1 b: 1 c: 1 d: 1

a: 1 b: 1 c: 1 d: 10

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DanceOn

    DanceOn

    6 Mayıs 2006
  • Defence Videos

    Defence Vide

    13 Mayıs 2013
  • Rickymon Tero

    Rickymon Ter

    1 Ocak 2007