Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> C++0X atomic, асинхронное удаление из lock_free stack 
:(
    Опции темы
Леопольд
Дата 3.12.2010, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(Леопольд @  3.12.2010,  09:46 Найти цитируемый пост)
на работа одноядерная машина, на ней падает почти сразу.

С таким спин локом, тоже падает...
Код
        bool busy = false;
        while(!m_malloc_lock.compare_exchange_weak(busy, true)) busy = false;
            node * new_node = static_cast<node *>(::malloc(sizeof(node)));
        m_malloc_lock.exchange(false);
//...
        bool busy = false;
        while(!m_malloc_lock.compare_exchange_weak(busy, true)) busy = false;
            ::free(head);
        m_malloc_lock.exchange(false);

Может я зря грешу на malloc/free?

P.S.
Временами, relacy на спин локе зависает наглухо...

P.P.S Пока malloc не отработает, память в список не записывается. Но он может быть вызван до того, как free закончит работать (а может ещё операционка что-то делает с ОЗУ?).
Что ж, это за зверь такой: "lock free malloc"?

Это сообщение отредактировал(а) Леопольд - 3.12.2010, 11:39


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Леопольд
Дата 3.12.2010, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Очевидно что отдельно от push, pop отрабатывает нормально:
сперва забиваю стек (10 миллионов элементов), потом 100 потоков начинают дёргать pop
что радует, когда последний поток закончил работать, вся память полностью освободилась (в отличие от предыдущих "кривоногих" версий).
Шанс получить "хвост" в конце работы всех потоков пренебрежительно мал. И чем больше потоков, тем меньше шансов. Самый невезучий подчищает за всеми.

http://liveworkspace.org/code/1d76fb72fafa...af5403f5ae0b02e

На одноядерной (Ubuntu 10.04 g++4.5.1) тоже работает без сбоев.



Тут вывод поинтереснее: http://liveworkspace.org/code/81347b6f4ba2...09c75a0fbcc31a5
Код
stack initial size = 10000001

thread 44 has finished
stack size = 2642345
unreleased queue size = 3660181

thread 48 has finished
stack size = 2589150
unreleased queue size = 3707905

thread 18 has finished
stack size = 2537135
unreleased queue size = 3759920

thread 4 has finished
stack size = 2414236
unreleased queue size = 3559001

thread 7 has finished
stack size = 2314566
unreleased queue size = 3529441

thread 59 has finished
stack size = 2230629
unreleased queue size = 3521894

thread 10 has finished
stack size = 2162419
unreleased queue size = 3484866

thread 49 has finished
stack size = 2128617
unreleased queue size = 3518668

thread 9 has finished
stack size = 2117141
unreleased queue size = 3486890

thread 29 has finished
stack size = 2007886
unreleased queue size = 3290803

thread 41 has finished
stack size = 1999288
unreleased queue size = 3277614

thread 0 has finished
stack size = 1864715
unreleased queue size = 3174104

thread 12 has finished
stack size = 1839678
unreleased queue size = 3199141

thread 14 has finished
stack size = 1825162
unreleased queue size = 3213657

thread 23 has finished
stack size = 1812291
unreleased queue size = 3226528

thread 65 has finished
stack size = 1736287
unreleased queue size = 3216530

thread 55 has finished
stack size = 1726989
unreleased queue size = 3225828

thread 6 has finished
stack size = 1725092
unreleased queue size = 3227725

thread 28 has finished
stack size = 1673922
unreleased queue size = 3195378

thread 13 has finished
stack size = 1650342
unreleased queue size = 3218958

thread 66 has finished
stack size = 1611956
unreleased queue size = 3110658

thread 30 has finished
stack size = 1594565
unreleased queue size = 3128049

thread 77 has finished
stack size = 1573693
unreleased queue size = 2946389

thread 3 has finished
stack size = 1563860
unreleased queue size = 2912076

thread 40 has finished
stack size = 1459541
unreleased queue size = 2855257

thread 21 has finished
stack size = 1429850
unreleased queue size = 2841847

thread 46 has finished
stack size = 1407019
unreleased queue size = 2778359

thread 31 has finished
stack size = 1406712
unreleased queue size = 2778666

thread 2 has finished
stack size = 1366253
unreleased queue size = 2764690

thread 62 has finished
stack size = 1334392
unreleased queue size = 2796551

thread 17 has finished
stack size = 1306581
unreleased queue size = 2738526

thread 37 has finished
stack size = 1306031
unreleased queue size = 2739076

thread 39 has finished
stack size = 1305696
unreleased queue size = 2739411

thread 81 has finished
stack size = 1272058
unreleased queue size = 2639992

thread 36 has finished
stack size = 1269776
unreleased queue size = 2642274

thread 63 has finished
stack size = 1229666
unreleased queue size = 2514145

thread 43 has finished
stack size = 1201958
unreleased queue size = 2518313

thread 50 has finished
stack size = 1143983
unreleased queue size = 2489735

thread 94 has finished
stack size = 1138499
unreleased queue size = 2495219

thread 8 has finished
stack size = 1131589
unreleased queue size = 2396755

thread 56 has finished
stack size = 1126783
unreleased queue size = 2401561

thread 24 has finished
stack size = 1103550
unreleased queue size = 2367027

thread 22 has finished
stack size = 1090631
unreleased queue size = 2375937

thread 53 has finished
stack size = 1087141
unreleased queue size = 2379427

thread 85 has finished
stack size = 1085738
unreleased queue size = 2380830

thread 45 has finished
stack size = 1083072
unreleased queue size = 2383496

thread 83 has finished
stack size = 1075907
unreleased queue size = 2390661

thread 97 has finished
stack size = 1067448
unreleased queue size = 2277675

thread 5 has finished
stack size = 1058138
unreleased queue size = 2189389

thread 38 has finished
stack size = 1053359
unreleased queue size = 2194168

thread 72 has finished
stack size = 1041007
unreleased queue size = 2206520

thread 87 has finished
stack size = 1038184
unreleased queue size = 2148721

thread 96 has finished
stack size = 1033579
unreleased queue size = 2127381thread thread 67 has finished
stack size = 982341
unreleased queue size = 2168983

thread 26 has finished
stack size = 979851
unreleased queue size = 2141491

thread 25 has finished
stack size = 980879
unreleased queue size = 2170445

84 has finished
stack size = 1008982
unreleased queue size = 2142342



thread 57 has finished
stack size = 967586
unreleased queue size = 2110870

thread 19 has finished
stack size = 961933
unreleased queue size = 2116523

thread 33 has finished
stack size = 951173
unreleased queue size = 2081633

thread 68 has finished
stack size = 949458
unreleased queue size = 2083348

thread 71 has finished
stack size = 936008
unreleased queue size = 1866626

thread 51 has finished
stack size = 919471
unreleased queue size = 1675180

thread 20 has finished
stack size = 919292
unreleased queue size = 1665446

thread 99 has finished
stack size = 898377
unreleased queue size = 1643406

thread 16 has finished
stack size = 847777
unreleased queue size = 1694006

thread 54 has finished
stack size = 842433
unreleased queue size = 1699350

thread 64 has finished
stack size = 833509
unreleased queue size = 1708274

thread 75 has finished
stack size = 815762
unreleased queue size = 1644418

thread 89 has finished
stack size = 747456
unreleased queue size = 1585001

thread 78 has finished
stack size = 734042
unreleased queue size = 1377750

thread 93 has finished
stack size = 703387
unreleased queue size = 1408405

thread 88 has finished
stack size = 696701
unreleased queue size = 1415091

thread 34 has finished
stack size = 633226
unreleased queue size = 1154936

thread 32 has finished
stack size = 616764
unreleased queue size = 1078504

thread 91 has finished
stack size = 602533
unreleased queue size = 1092735

thread 82 has finished
stack size = 571859
unreleased queue size = 1038972

thread 1 has finished
stack size = 560558
unreleased queue size = 1005796

thread 73 has finished
stack size = 553461
unreleased queue size = 1012893

thread 42 has finished
stack size = 543609
unreleased queue size = 1022743

thread 15 has finished
stack size = 532778
unreleased queue size = 987826

thread 60 has finished
stack size = 504121
unreleased queue size = 1016483

thread 70 has finished
stack size = 499674
unreleased queue size = 955828

thread 95 has finished
stack size = 437003
unreleased queue size = 909881

thread 58 has finished
stack size = 433946
unreleased queue size = 912938

thread 80 has finished
stack size = 411691
unreleased queue size = 935194

thread 69 has finished
stack size = 374313
unreleased queue size = 950588

thread 92 has finished
stack size = 360115
unreleased queue size = 921313

thread 98 has finished
stack size = 318550
unreleased queue size = 933257

thread 76 has finished
stack size = 314318
unreleased queue size = 937489

thread 74 has finished
stack size = 309366
unreleased queue size = 942441

thread 35 has finished
stack size = 306487
unreleased queue size = 945320

thread 47 has finished
stack size = 238476
unreleased queue size = 748038

thread 86 has finished
stack size = 200546
unreleased queue size = 699032

thread 52 has finished
stack size = 130401
unreleased queue size = 468879

thread 79 has finished
stack size = 92753
unreleased queue size = 332552

thread 61 has finished
stack size = 83495
unreleased queue size = 209966

thread 90 has finished
stack size = 54268
unreleased queue size = 47116

thread 27 has finished
stack size = 35949
unreleased queue size = 12567

thread 11 has finished
stack size = 1
unreleased queue size = 0


exit code: 0, execution time: 9.5688


Это сообщение отредактировал(а) Леопольд - 3.12.2010, 14:19


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
azesmcar
Дата 3.12.2010, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Леопольд

Добавил немного комментариев, теперь давай прочитаем код
Код

boost::shared_ptr<T> pop()
{
    boost::shared_ptr<T> ret;

    // увеличиваем количество потоков в функции pop
    m_threads_on_lap($).fetch_add(1);
    
    // убираем элемент из списка
    node * head = m_head($).load();
    while(head && !m_head($).compare_exchange_weak(head, head->next));
    
    // если элемент получен, т.е. список был не пуст
    if(head)
    {
        // устанавливаем возвращаемое значение
        ret.swap(head->data);

        // добавляем элемент в начало списка элементов на удаление
        head->next = m_deleted_head($).load();
        while(!m_deleted_head($).compare_exchange_weak(head->next, head));
    }

    // если это последний поток, т.е. больше в функции pop потоков на данный момент нет
    if(m_threads_on_lap($).fetch_sub(1) - 1 == 0)
    {
        // проверяем, что никто не менял m_deleted_head с того момента, как мы добавили туда элемент
        if (m_deleted_head($).compare_exchange_strong(head, 0))
        {
            // удаляем все элементы, подлежащие удалению
            while(head)
            {
                node * next = head->next;
                delete head;
                head = next;
            }
        }
    }
    return ret;
}

начнем со строки 24.
тут ты сперва проверяешь, что это единственный поток в функции pop (кстати все время хочу спросить почему value - 1 == 0 а не value == 1?).
потом проверяешь, что никто не менял m_deleted_head и он все еще равен head-у, т.е. поменять может в том случае, если в этом промежутке создался другой поток.
дальше, если ничего менялось ты удаляешь все элементы.
Вот тут то и проблема. Представь, что 1 твой поток дошел до строки 33, удали элемент, на который на данный момент указывает m_deleted_head (так как m_deleted_head и head указывают на ту же область памяти) и передал управление второму, который пытается добавить следующий элемент в список на удаление, но натыкается на UB на строке 20.
В примере я не зря очищал m_deleted_head и отделял от него весь список в локальный указатель, это делалось для того, чтобы другой поток в это время не смог с ним работать.
PM   Вверх
Леопольд
Дата 3.12.2010, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(azesmcar @  3.12.2010,  14:19 Найти цитируемый пост)
который пытается добавить следующий элемент в список на удаление, но натыкается на UB на строке 20.
Если поток1 находится на двадцатой строке, то m_threads_on_lap($).fetch_sub(1) - 1 == 0 не выполнится. Если потокN дошёл до 9-й строки, то он никак не может получить тот же указатель "head" из-за 10 строки.

Это сообщение отредактировал(а) Леопольд - 3.12.2010, 14:25


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
azesmcar
Дата 3.12.2010, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(Леопольд @  3.12.2010,  14:23 Найти цитируемый пост)
Если кто-то находится на двадцатой строке, то m_threads_on_lap($).fetch_sub(1) - 1 == 0 не выполнится. А если выполнится, значит ни один поток не владеет тем же указателем.

Ты забываешь, что это две разные проверки и они НЕ атомарны. Потому я и отделил их в два отдельных if-а, чтобы было нагляднее.
Возможна такая ситуация: первая проверка выполняется, перед началом выполнения второй, другой поток входит в функцию pop.

Добавлено через 1 минуту и 56 секунд
Код

    // если это последний поток, т.е. больше в функции pop потоков на данный момент нет
    if(m_threads_on_lap($).fetch_sub(1) - 1 == 0)
    {
        // В ЭТОТ МОМЕНТ ДРУГОЙ ПОТОК МОЖЕТ НАЧАТЬ ВЫПОЛНЕНИЕ pop
        if (m_deleted_head($).compare_exchange_strong(head, 0))
        {



Это сообщение отредактировал(а) azesmcar - 3.12.2010, 14:25
PM   Вверх
Леопольд
Дата 3.12.2010, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(azesmcar @  3.12.2010,  14:24 Найти цитируемый пост)
Ты забываешь, что это две разные проверки и они НЕ атомарны.
Не, про это я уже не забываю. smile
Здесь проблема появляется когда параллельно начинаешь запихивать элементы в стек.

Можно и сильнее нагрузить, результать будет тот же.
100 потоков удаляют 10000000 элементов из стека размером 100000001 элементов:
http://liveworkspace.org/code/81347b6f4ba2...09c75a0fbcc31a5

Цитата
// В ЭТОТ МОМЕНТ ДРУГОЙ ПОТОК МОЖЕТ НАЧАТЬ ВЫПОЛНЕНИЕ pop
пусть выполняет. Он уже никак не сможет получить тот же указатель из m_head. Если потокY в этот момент заменит m_deleted_head, то у него указатель на начало очереди на удаление, в которой и "наш" сидит уже. Оставляем очищать ему.

Это сообщение отредактировал(а) Леопольд - 3.12.2010, 14:43


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Леопольд
Дата 3.12.2010, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(azesmcar @  3.12.2010,  14:19 Найти цитируемый пост)
тут ты сперва проверяешь, что это единственный поток в функции pop (кстати все время хочу спросить почему value - 1 == 0 а не value == 1?).
Это проверка нужна не для того, что-бы гарантировать единственность. Она гарантирует что все потоки, которые зашли в pop прошли эту отметку и закончили работу со своими указателями. Почему не сравниваю с единицей сам не пойму smile

Я пытался найти способ ответвить один поток в своё русло при помощи одного только стчётчика, но так и не смог. Но тут помогла compare_exchange_strong на m_deleted_head. Тот, кто смог её выполинть, гарантированно владеет списком указателей, с которыми больше никто не работает. Поэтому вся работа с указателями происходит до того как уменьшается счётчик. Я и имя ему такое дал, что бы с гонками ассоциировалось. Чистит хвосты самый нерадивый. smile
Это, кстати, наглядно из логов видно (пару постов назад)


Это сообщение отредактировал(а) Леопольд - 3.12.2010, 14:58


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
azesmcar
Дата 3.12.2010, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Леопольд

Да, это я напутал..ты тоже тут выделяешь список в отдельную переменную, но проблема все равно та же.
Цитата(azesmcar @  3.12.2010,  14:24 Найти цитируемый пост)
// В ЭТОТ МОМЕНТ ДРУГОЙ ПОТОК МОЖЕТ НАЧАТЬ ВЫПОЛНЕНИЕ pop

процитирую статью
Код

void try_reclaim(node* old_head)
{
    if(threads_in_pop == 1)
    {
        node* nodes_to_delete = to_be_deleted.exchange(NULL);
        if(--threads_in_pop == 0)
        {
            delete_nodes(nodes_to_delete);
        }
        else if(nodes_to_delete)
        {
            chain_node_list(nodes_to_delete);
        }
        delete old_head;
    }
    else
    {
        chain_one_node(old_head);
        --threads_in_pop;
    }
}

Цитата

еще одна проверка значения счетчика нужна для того, чтобы удостовериться, что никакой другой поток не начал выполняться в промежутке между первой проверкой и обменом указателя to_be_deleted на NULL.

описываю проблемную ситуацию, номера строк смотри в моем коде.
1-ый поток входит в pop
2-ой поток входит в pop
3-ий поток входит в pop
1-ый поток продолжает выполнение и доходит до строки 27, так-как остальные два потока пока не инкрементировали значение счетчика
2-ой поток начинает выполнение и доходит до строки 10
3-ий поток начинает выполнение и доходит до строки 10
2-ой поток удаляет элемент из списка и дойдя до строки 20 помещает его в список на удаление
1-ый поток продолжает работу и выделяет список в локальную переменную m_deleted_head
1-ый поток доходит до цикла на строке 30 и начинает удалять элементы, включая тот, который туда поместил 2-ой поток
3-ий поток просыпается и все еще ссылается на тот элемент, который поместил в список на удаление 2-ой поток
3-ий поток при попытке выполнить 10-ую строку вылетит с ошибкой

в двух словах: один поток удаляет объект, помещенный в список другим поток, на который ссылается третий.

Это сообщение отредактировал(а) azesmcar - 3.12.2010, 15:06
PM   Вверх
Леопольд
Дата 3.12.2010, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(azesmcar @  3.12.2010,  15:02 Найти цитируемый пост)
1-ый поток продолжает работу и выделяет список в локальную переменную m_deleted_head
Этого не будет. 1-ый поток один раз попытается сделать strong CAS, но 2-ой поток изменил его, пэтому 1-ый поток получит false (не сможет выделить список в локальную переменную).

Цитата(azesmcar @  3.12.2010,  15:02 Найти цитируемый пост)
в двух словах: один поток удаляет объект, помещенный в список другим поток, на который ссылается третий.
Но такая бага действительно имела место быть в предыдущих вариантах (по моему, relacy мне её показал).

Вообще, relacy классная штука. Я когда первый вариант ему подсунул, он тут же показал что память течёт рекой... smile

Добавлено @ 15:31
Цитата(azesmcar @  3.12.2010,  15:02 Найти цитируемый пост)
процитирую статью
Вариант из статьи форсирует алгоритм "гулять" по очереди туда-обратно. К тому же, он вставляет очередь обратно по одномоу элементу, постоянно мешая другим потокам, что очень негативно сказывается на производительности. С 10 миллионами элементов он будет работать очень долго. Сперва я пытался сделать что-бы он вставлял обратно очередь сразу всю целиком, но всё равно приходилось "гулять" из конца в конец. Именно поэтому, я решил попробовать сделать иначе. Обойти этот момент. Похоже удалось.

Но возникает какая-то загадочная проблема с выделением и освобождением памяти параллельно.


Это сообщение отредактировал(а) Леопольд - 3.12.2010, 15:36


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
azesmcar
Дата 3.12.2010, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(Леопольд @  3.12.2010,  15:19 Найти цитируемый пост)
Этого не будет. 1-ый поток один раз попытается сделать strong CAS, но 2-ой поток изменил его, пэтому 1-ый поток получит false (не сможет выделить список в локальную переменную).

Да, верно..невнимательный я что-то, не обратил внимания на if. А тут точно есть проблема в функции pop? Я ничего другого не вижу, вроде все в порядке.
PM   Вверх
Леопольд
Дата 3.12.2010, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(azesmcar @  3.12.2010,  15:35 Найти цитируемый пост)
А тут точно есть проблема в функции pop?
Похоже что нет. Я пришёл к мнению что с pop всё ОК. Пробовал под большой нагрузкой и relacy всё проверил. 
Цитата(Леопольд @  3.12.2010,  15:19 Найти цитируемый пост)
возникает какая-то загадочная проблема с выделением и освобождением памяти параллельно.



Это сообщение отредактировал(а) Леопольд - 3.12.2010, 15:38


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
azesmcar
Дата 3.12.2010, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(Леопольд @  3.12.2010,  15:19 Найти цитируемый пост)
Но возникает какая-то загадочная проблема с выделением и освобождением памяти параллельно.

где и как это проявляется?
PM   Вверх
Леопольд
Дата 3.12.2010, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(azesmcar @  3.12.2010,  15:38 Найти цитируемый пост)
где и как это проявляется? 
Надо несколько потоков запустить. Половина вставляет элементы, другая половина выкидывает. При большом  количестве потоков и элементов.

P.S. пора домой...


Это сообщение отредактировал(а) Леопольд - 3.12.2010, 15:40


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
azesmcar
Дата 3.12.2010, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Леопольд, 
Цитата(Леопольд @  3.12.2010,  15:40 Найти цитируемый пост)
Надо несколько потоков запустить. Половина вставляет элементы, другая половина выкидывает. При большом  количестве потоков и элементов.

я теряюсь в твоих исходниках, уже не понимаю которая версия правильная, которая нет..покажи пальцем где и когда происходит.
PM   Вверх
azesmcar
Дата 3.12.2010, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Леопольд

А у тебя там случайно не bad_alloc вылетает?
PM   Вверх
Страницы: (6) Все « Первая ... 2 3 [4] 5 6 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0623 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.