Хорошая книжка по многопоточности?

Тема в разделе "WASM.BOOKS и WASM.BLOGS", создана пользователем scf, 19 мар 2011.

  1. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    Интересны атомарные операции, optimistic locks, неблочащиеся структуры данных, транзакционность в многопоточном окружении, применение этого всего на практике(без привязки к какому-то API).
    Мьютексы/семафоры/баяны не интересны.

    Буржуйским владею.
     
  2. Ra_

    Ra_ New Member

    Публикаций:
    0
    Регистрация:
    4 мар 2007
    Сообщения:
    289
    первая на вскидку
    http://www.ebook-4download.com/2010/10/multithreading-applications-in-win32/

    если кому надо - cd к книге нашлось 8мег
    http://www.informit.com/title/0201442345
    http://www.informit.com/content/images/0201442345/CDContents/CDcontents.zip
     
  3. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    http://www.books.ru/shop/books/357604
     
  4. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    Увы, обе книги слишком стары - они про пессимистичные блокировки и соответствующее API.
     
  5. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    scf
    Ты хоть одну из них читал?
    прежде чем ***** всякую говорить...
    ?
     
  6. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    featurelles
    Просмотрел. В твоей про атомарные операции ровно 2 страницы текста + описание API + пара примеров... В соответствующем разделе, "атомарные операции".
    К сожалению, этого мне недостаточно.
     
  7. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    scf
    У меня вопрос.
    "неблочащиеся структуры данных, транзакционность в многопоточном окружении"
    Здесь нет противоречия?
     
  8. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    Вообще нет.
    Используя версионность данных, создание копий и "правильный" порядок обновления элементов данных, можно добиться транзакционности. Как при этом резолвить конфликты - это, конечно, уже отдельный вопрос :)
    Применения:
    -sql server snapshot isolation
    -облачные/кластерные базы - master-to-master replication
    -практическое применение документ-ориентированных СУБД.
    Они предоставляют по сути то же API, что и атомарные операции - get-and-set и т.п.
    Мне не особо хочется изобретать велосипеды, вот и интересуюсь, может их кто-то изобрел до меня...

    edit: еще забавная штука - структуры данных на атомарных операциях - очереди, стеки, может даже ассоциативные массивы... Они используют оптимистичную блокировку и поэтому куда шустрее классических реализаций на мьютексах. Вот только инфу о принципах построения таких вещей фиг найдешь.
     
  9. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    scf
    Спасибо за ответ.
    Если тут чтонить дельное посоветуют, тоже почитаю.
     
  10. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    scf
    Хороших книг не видел.
    А вы уверены что оптимистическая блокировка связана с атомарными операциями?


    Там не сложно. Только я пришёл к выводу что при параллельном программировании используются другие структуры и механизмы и их больше чем классических. Классические хотя и лежат в основе, но как по мне это уже новые структуры.
     
  11. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
  12. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    Pavia
    Ну как :)
    Я всегда считал, что оптимистичная(или оптимистическая? optimistic lock короче) блокировка - это когда сначала разделяемый ресурс захватывается, а уже потом определяется, был ли конфликт при захвате. Если конфликт был - то операция повторяется позже. И я в курсе всего о двух механизмах синхронизации - блокирующий(мьютексы и производные от них) и атомарные операции. Т.е. т.к. на мьютексах такое не сделаешь, то остаются только атомарные операции.

    Ниже пример реализации мьютекса на атомарных операциях, если кому интересно. Имхо реализация примитивов синхронизации на ассемблере должна выглядеть примерно так же.

    Код (Text):
    1. package ru.scf37.todo;
    2.  
    3. import java.util.ArrayList;
    4. import java.util.List;
    5. import java.util.concurrent.atomic.AtomicBoolean;
    6.  
    7. import junit.framework.Assert;
    8.  
    9. import org.junit.Test;
    10.  
    11. public class AtomicTest {
    12.     private AtomicBoolean atomic = new AtomicBoolean(); //atomic boolean
    13.     private Boolean locked = false; //boolean variable(also serves as mutex) to validate locked state.
    14.    
    15.     @Test
    16.     public void testAtomicLock() {
    17.         Runnable job = new Runnable() {
    18.             @Override
    19.             public void run() {
    20.                 atomicLock();
    21.                 synchronized (locked) { //entering mutex
    22.                     Assert.assertFalse(locked); //should be false
    23.                     locked = true;
    24.                 }
    25.                 try {
    26.                     Thread.sleep(250);
    27.                 } catch (InterruptedException e) {
    28.                 }
    29.                 synchronized (locked) { //entering mutex
    30.                     Assert.assertTrue(locked); //should be still locked
    31.                     locked = false;
    32.                 }
    33.                 atomicUnlock();
    34.             }
    35.         };
    36.         List<Thread> threads = new ArrayList<Thread>();
    37.         for (int i = 0 ; i < 25 ; i++) {
    38.             Thread thread = new Thread(job);
    39.             thread.start();
    40.             threads.add(thread);
    41.         }
    42.         for (Thread t : threads) {
    43.             try {
    44.                 t.join();
    45.             } catch (InterruptedException e) {
    46.             }
    47.         }
    48.     }
    49.    
    50.     private void atomicLock() {
    51.         while (true) {
    52.             boolean oldValue = atomic.getAndSet(true);
    53.             if (oldValue == true) {
    54.                 //oops, it is already locked by someone - wait and try again
    55.                 try {
    56.                     Thread.sleep(200); //sleeeeep or do something else here....
    57.                 } catch (InterruptedException e) {
    58.                 }
    59.             } else {
    60.                 break;
    61.             }
    62.         }
    63.     }
    64.    
    65.     private void atomicUnlock() {
    66.         atomic.set(false);
    67.     }
    68. }
     
  13. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    Pavia
    Видел, но маловато будет
     
  14. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    scf
    http://www.rsdn.ru/forum/java/3622844.flat.aspx
     
  15. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    scf
    гдето так оно и делается

    _lock proc LockAddr, isLock
    mov ecx, LockAddr
    mov eax, isLock
    xchg [ecx], eax
    ret
    _lock endp

    что делать если возвращается признак заблокированности ресурса - ваше дело. можете организовывать буфера (особенно актуально, когда с инетом дело имеешь), можете выполнять другие операции, можете ждать, можете попробовать уточнить обстановку на предмет висяка, например.

    разные среды предоставляют разные реализации этих возможностей. дальнейшее поскипано заради покоя
     
  16. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    wsd
    Хорошая штука для самообразования и особенно подготовки к собеседованиям.

    НО - самое главное - это книга, которая упоминается в последнем посте.
    Maurice Herlihy, Nir Shavit - The Art of Multiprocessor Programming - 2008

    Она написана с упором на java, но отдельные главы однозначно будут интересны всем, занимающимся разработкой многопоточных/асинхронных приложений.
     
  17. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    qqwe
    А разве префикс LOCK не нужен перед xchg?
     
  18. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    scf
    xchg атомарная команда. Поэтому префикс LOCK ненужен.
     
  19. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    ещё есть инструкция xadd.
     
  20. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    t00x
    Перед xadd надо добавлять префикс LOCK.
    Ровно как и перед другими. Но так в процессоре полно команд которые можно использовать вместе с LOCK. Для решения проблем синхронизации.