c 下使用讀寫鎖控制多執行緒使用統一私有變數

2021-10-25 03:12:29 字數 2025 閱讀 8917

今天在乙個類a中定義了私有變數member,然後定義了read和write方法用於讀取該變數和設定該變數。但是在使用時是在類b中定義了乙個a的物件a,然後在a中啟動了乙個執行緒t1,在t1中呼叫a.write(),又啟動了乙個執行緒t2,在其中呼叫了a.read();這樣算上主線程,總共3個執行緒,裡面對私有變數menber進行了同時讀寫。在執行過程中,報2個錯:

free(): corrupted

unsorted chunks

corrupted size

vs. prev_size 記憶體溢位

後面分析是因為read和write方法中都是用了while(1)進行頻繁讀寫,可能造成了對member的讀寫搶占,造成出錯。後面使用了讀寫鎖解決了上述問題。

1. 引入標頭檔案

#include

2. 在a類的.h中定義讀寫鎖

pthread_rwlock_t rw_lock;

3. 在對讀寫共用的變數賦值前後加鎖、解鎖

加寫鎖:

pthread_rwlock_wrlock(&rw_lock);//加鎖

aimageaddparam.time = tv.tv_sec * 1000000 + tv.tv_usec;

if (len > 0)

***xx

}pthread_rwlock_unlock(&rw_lock);//釋放鎖

加讀鎖:

void getvecparameters(std::vector¶m)

#pragma comment(lib, "pthreadvc2.lib")     //必須加上這句

pthread_t t1; //pthread_t變數t1,用於獲取執行緒1的id

pthread_t t2; //pthread_t變數t2,用於獲取執行緒2的id

pthread_rwlock_t rwlock; //宣告讀寫鎖

int data=1;

//共享資源

void* readerm(void* arg)

return null;

}void* readern(void* arg)

return null;

}void* writera(void* arg)

return null;

}void* writerb(void* arg)

return null;

}void main(int argc,char** ar**)

4. 修改cmakelist.txt

增加pthread到target_link_libraries段中

if(cmake_compiler_is_gnucxx or cmake_cxx_compiler_id matches "clang")

add_compile_options(-wall -wextra -wpedantic -pthread -lboost_filesystem)

endif()

##message(micros_version: $)

if(compiler_supports_cxx11)

set(cmake_cxx_flags "$ -std=c++11 -pthread")

elseif(compiler_supports_cxx0x)

set(cmake_cxx_flags "$ -std=c++0x")

else()

message(status "the compiler $ has no c++11 support. please use a different c++ compiler.")

endif()

target_link_libraries(micros_scene_3light_ranging optimized

gimbal_ctrl

pthread

)

C 實現多執行緒讀寫鎖

在win32下用c 實現多執行緒讀寫鎖 讀寫鎖實際是一種特殊的自旋鎖,它把對共享資源的訪問者劃分成讀者和寫者,讀者只對共享資源進行讀訪問,寫者則需要對共享資源進行寫操作。這種鎖相對於自旋鎖而言,能提高併發性,因為在多處理器系統中,它允許同時有多個讀者來訪問共享資源,最大可能的讀者數為實際的邏輯cpu...

c 下使用多執行緒

執行緒主要由cup暫存器 呼叫棧 執行緒本地儲存器 thread local storage,tls 組成。cup暫存器主要記錄當前所執行執行緒的狀態,呼叫棧主要用於維護執行緒所呼叫到的記憶體和資料,tsl主要用於存放執行緒的狀態資訊。前台執行緒 只有所有的前台執行緒全部關閉,才能完成程式關閉。後台...

C 多執行緒中鎖的使用

最近的專案中涉及到實時資料的處理,經常會使用多執行緒訪問共享資源。如果處理不當,資源未能正確在各個執行緒中同步的話,計算結果將會出現錯誤。關於資源同步最常用的技術就是加鎖。這裡提到是乙個比較簡單的鎖 lock。lock是對monitor中的兩個函式enter和exit的封裝。當時專案的模式是這樣的 ...