синхронизация доступа к вектору [С++]

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by C@T, 22 Mar 2013.

  1. C@T

    C@T Member

    Joined:
    7 Sep 2011
    Messages:
    12
    Likes Received:
    6
    Reputations:
    10
    есть такая ситуация:
    1 поток добавляет что то в вектор(редактирует по сути)
    n потоков все время читают что то из этого вектора

    ну и само собой когда происходит попытка чтения элемента, когда он не до конца запушбэкался, программа падает

    нужно синхронизировать доступ к глобальному вектору, но юзать крит секции(в моем случае мутексы, под Linux), не хочется так как чтение происходит гораздо чаще чем запись, и поэтому потоки которые читают тоже выстраиваются в очередь, что влияет на производительность, хочется сделать так что бы потоки чтения блокировались только на тот момент когда происходит редактирование вектора

    подскажите как быть :)

    З.Ы думал сделать через sem_post/sem_wait но не придумал как именно :/
     
  2. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    492
    Likes Received:
    187
    Reputations:
    5
    А можно же как-то блокировать тот же мьютекс по критерию
    PHP:
    if(Если идет запись)
      
    блок мьютекса;
    else
       
    Мьютекс не блокируется;
     
    #2 rudi, 22 Mar 2013
    Last edited: 22 Mar 2013
    2 people like this.
  3. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    http://en.wikipedia.org/wiki/Readers–writer_lock
    Погуглил бы хоть, даже в boost есть имплементация, все ссылки есть на странице в Wiki.
     
  4. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    еще в NTDLL.DLL есть этот механизм

    Code:
    RtlAcquireResourceExclusive
    RtlAcquireResourceShared
    RtlConvertExclusiveToShared
    RtlConvertSharedToExclusive
    RtlDeleteResource
    RtlDumpResource
    RtlInitializeResource
    RtlReleaseResource