so true

          心懷未來(lái),開創(chuàng)未來(lái)!
          隨筆 - 160, 文章 - 0, 評(píng)論 - 40, 引用 - 0
          數(shù)據(jù)加載中……

          read-write lock

          (一)當(dāng)前被讀鎖占著
              1。如果讀優(yōu)先(默認(rèn)是PTHREAD_RWLOCK_PREFER_READER_NP,即讀優(yōu)先),那么等著的讀請(qǐng)求可以快速拿到鎖,寫一直被餓著(直到?jīng)]有任何等待獲取讀鎖的情況下,寫才能拿到寫鎖);
              2。如果寫優(yōu)先,那么讀和寫都等著,一但前面的讀釋放了鎖,寫立刻就會(huì)優(yōu)先讀來(lái)拿到鎖;
          (二)當(dāng)前被寫鎖占著
              不論誰(shuí)優(yōu)先,都需要把所有等著的寫都服務(wù)完,才會(huì)給讀機(jī)會(huì),所以寫多讀少的情況下,就應(yīng)該用互斥鎖了;

          測(cè)試程序:
          #include <iostream>
          #include <string>
          #include <fstream>
          #include <sstream>
          #include <stdint.h>
          #include <pthread.h>
          #include <vector>
          #include <map>
          #include <set>
          using namespace std;
          long g_idx = 0;
          class ThreadRwLock {
          private:
              pthread_rwlock_t m_rw_mutex;
          public:
              ThreadRwLock() {
                  pthread_rwlockattr_t attr;
                  // 設(shè)置寫優(yōu)先
                  pthread_rwlockattr_init(&attr);
                  //pthread_rwlockattr_setkind_np(&attr, PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP);
                  pthread_rwlock_init(&m_rw_mutex, &attr);
              }
              ~ThreadRwLock() {
                  pthread_rwlock_destroy(&m_rw_mutex);
              }
              void rdlock() {
                  pthread_rwlock_rdlock(&m_rw_mutex);
              }
              void wrlock() {
                  pthread_rwlock_wrlock(&m_rw_mutex);
              }
              int tryrdlock() {
                  return pthread_rwlock_tryrdlock(&m_rw_mutex);
              }
              int trywrlock() {
                  return pthread_rwlock_trywrlock(&m_rw_mutex);
              }
              void unlock() {
                  pthread_rwlock_unlock(&m_rw_mutex);
              }
          };
          ThreadRwLock g_lock;
          void* thread_routine(void* arg) {
              long is_write = (long)arg;
              if (is_write) {
                  printf("%lu wait write lock\n", pthread_self()); fflush(stdout);
                  g_lock.wrlock();
                  long idx = __sync_add_and_fetch(&g_idx, 1);
                  printf("%lu get write lock, %ld\n", pthread_self(), idx); fflush(stdout);
                  sleep(5);
                  g_lock.unlock();
              } else {
                  printf("%lu wait read lock\n", pthread_self()); fflush(stdout);
                  g_lock.rdlock();
                  long idx = __sync_add_and_fetch(&g_idx, 1);
                  printf("%lu get read lock, %ld\n", pthread_self(), idx); fflush(stdout);
                  sleep(5);
                  g_lock.unlock();
              }
              return NULL;
          }
          int main(int argc, char* argv[]) {
              pthread_t tid = 0;
              pthread_create(&tid, NULL, thread_routine, (void*)0);
              pthread_create(&tid, NULL, thread_routine, (void*)0);
              pthread_create(&tid, NULL, thread_routine, (void*)0);
              pthread_create(&tid, NULL, thread_routine, (void*)0);
              pthread_create(&tid, NULL, thread_routine, (void*)0);
              pthread_create(&tid, NULL, thread_routine, (void*)1);
              getchar(); //讓程序暫停,等待鍵盤敲入一個(gè)字節(jié)后,接著走
              pthread_create(&tid, NULL, thread_routine, (void*)1);
              sleep(2); //確保寫鎖被優(yōu)先拿到
              pthread_create(&tid, NULL, thread_routine, (void*)0);
              pthread_create(&tid, NULL, thread_routine, (void*)0);
              pthread_create(&tid, NULL, thread_routine, (void*)1);
              pthread_create(&tid, NULL, thread_routine, (void*)1);
              pthread_create(&tid, NULL, thread_routine, (void*)1);
              pthread_create(&tid, NULL, thread_routine, (void*)1);
              pthread_create(&tid, NULL, thread_routine, (void*)1);
              pthread_create(&tid, NULL, thread_routine, (void*)0);
              pthread_create(&tid, NULL, thread_routine, (void*)0);
              pthread_create(&tid, NULL, thread_routine, (void*)1);
              pthread_create(&tid, NULL, thread_routine, (void*)1);
              pthread_create(&tid, NULL, thread_routine, (void*)1);
              pthread_create(&tid, NULL, thread_routine, (void*)1);
              pthread_create(&tid, NULL, thread_routine, (void*)1);
              pthread_create(&tid, NULL, thread_routine, (void*)1);
              pthread_create(&tid, NULL, thread_routine, (void*)1);
              pthread_create(&tid, NULL, thread_routine, (void*)1);
              pthread_create(&tid, NULL, thread_routine, (void*)1);
              pthread_create(&tid, NULL, thread_routine, (void*)1);
              pthread_create(&tid, NULL, thread_routine, (void*)0);
              pthread_create(&tid, NULL, thread_routine, (void*)0);
              getchar();
              return 0;
          }

          posted on 2018-05-14 12:07 so true 閱讀(209) 評(píng)論(0)  編輯  收藏 所屬分類: C&C++Linux

          主站蜘蛛池模板: 瓮安县| 民权县| 独山县| 涿鹿县| 武威市| 奉节县| 馆陶县| 浦县| 巴里| 兰溪市| 德州市| 开江县| 洛浦县| 剑川县| 永胜县| 韶山市| 大埔县| 吉安县| 行唐县| 阿克陶县| 商南县| 麻城市| 靖江市| 且末县| 巴中市| 金山区| 延安市| 新兴县| 顺平县| 云浮市| 辽源市| 普宁市| 沙河市| 巴东县| 石景山区| 鹰潭市| 无棣县| 钟山县| 株洲市| 屯昌县| 临桂县|