LINUX.ORG.RU

Копирующий конструктор C++ атомарная операция ?


0

0

Приложение многопоточно.
Есть клас, у которого есть копирующий конструктор:
TSomeClass(const TSomeClass & a);
Класс содержит некие ресурсы.

TSomeClass b;
/* ... */
TSomeClass A = TSomeClass(B);

Внимание вопрос:
Что будет если в одной нити для объекта A часть ресурсов объекта B скопиравано. А в другой нити объект B удаляется ?

Копирующий конструктор атомарная операция ?

anonymous

> Что будет если в одной нити для объекта A часть ресурсов объекта B скопиравано. А в другой нити объект B удаляется ?

Скорее всего, ничего хорошего.

> Копирующий конструктор атомарная операция ?

С какой стати? Переключение между нитями выполняется на уровне машинных команд, а не конструкций C++.

DKorolkov
()

Могу сказать даже больше, экспериментальным путем установлено что операция типа:

i++;

Где i есть int32.
Атомарной не является если многопоточное приложение работает на IA32 c ко-вом физических процессоров больше 1.

zaz ★★★★
()
Ответ на: комментарий от zaz

> Атомарной не является если многопоточное приложение работает на IA32 c ко-вом физических процессоров больше 1.

Интересно, и как проявляется неатомарность в этом случае?

erDiZz
()
Ответ на: комментарий от erDiZz

> Интересно, и как проявляется неатомарность в этом случае?

Если в одном треде идет ++ а вдругом -- то иногда в результате получаем сплошной бред (типа был 1 в одном прошел ++ в другом -- а в результате получили -56468).
Я так подозриваю что там происходят какието нестыковки при загрузке/выгрузке результатов процессоров в память (одновременно из двух по одному адресу)

zaz ★★★★
()
Ответ на: комментарий от Pi

нет, так как, например в момент начала выполнения операции --, 
результат выполнения операции ++ был не полность перекачен обратно
в память.

aton
()

> Копирующий конструктор атомарная операция ?
Текущая версия стандарта ни как не затрагивает вопрос многопоточного
окружения. И тем не менее достоверно известно, что копирующий конструктор не является автомарной операцией, это вообще не операция, и
необходимо использовать средства межпроцессорной синхронизации.

aton
()
Ответ на: комментарий от zaz

Действительно, в документации Intel написано, что чтобы inc был
атомарным, нужно использовать префикс lock. В ядре так и сделано:

static __inline__ void atomic_inc(atomic_t *v)
{
        __asm__ __volatile__(
                LOCK "incl %0"
                :"=m" (v->counter)
                :"m" (v->counter));
}

erDiZz
()
Ответ на: комментарий от erDiZz

Мужики Вы ушли от темы. Вы начали обсуждать реализацию атомарных операции на уровне ядра Linux(include/asm-i386/atomic.h). А автор хочет получить ответ на вопрос:

>Внимание вопрос: Что будет если в одной нити для объекта A часть ресурсов объекта B скопиравано. А в другой нити объект B удаляется ?

Вся подковырка была в том, что здесь используются не атомарные операции, а вообще идет речь об копировании объектов Если по коду, что Автор предоставил:

TSomeClass b;

/* ... */

TSomeClass A = TSomeClass(B);

Нужно понять что автор делает: копирования или присвоения. Копирование объектов производится с помощью копирующего конструктора, а операция присвоения с помощью одноименного оператора. До операции присвоения объект A должен быть проинициализирован.

Теперь, допустим что здесь производится копирование объектов, тогда возможно, что объект B уничтожается раньше до момента копирования, т.е. поток завершился раньше чем другой поток успел произвести операцию копирования. Таким образом, кажется здесь идет речь о Гонках.

rjaan ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.