如何判断一个类是否是线程安全(可重入)的?
生活随笔
收集整理的這篇文章主要介紹了
如何判断一个类是否是线程安全(可重入)的?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
答案:若一個類對外提供的接口的是原子的,或者說多線程編程時不用對該類的接口考慮同步問題,那么該類就是線程安全的類。
栗子:
#include <iostream> #include <string.h> #include <atomic> #include <pthread.h> #include <unistd.h>class Array { public:Array(){memset(data_, 0, sizeof(int) * 10);size = 0;}public:void push_back(const int &data){//pthread_mutex_lock(&mtx_);data_[size] = data;usleep(10);size++;//pthread_mutex_unlock(&mtx_);}void print(){for (size_t i = 0; i < 30; i++)std::cout << data_[i] << " ";std::cout << std::endl;}private:int data_[30];std::atomic<size_t> size;pthread_mutex_t mtx_; };Array g_array; using ADDDATAFUNC = void *(*)(void *);void *AddData1(void *arg); void *AddData2(void *arg); void *AddData3(void *arg);int main() {ADDDATAFUNC funcs[3] = {AddData1, AddData2, AddData3};pthread_t pid[3] = {0};for (size_t i = 0; i < 3; i++)pthread_create(pid + 1, nullptr, funcs[i], nullptr);for (size_t i = 0; i < 3; i++)pthread_join(*(pid + 1), nullptr);g_array.print();return 0; }void *AddData1(void *arg) {for (size_t i = 0; i < 10; i++){g_array.push_back(10 + i);usleep(100);}return 0; }void *AddData2(void *arg) {for (size_t i = 0; i < 10; i++){g_array.push_back(20 + i);usleep(100);}return 0; }void *AddData3(void *arg) {for (size_t i = 0; i < 10; i++){g_array.push_back(30 + i);usleep(100);}return 0; }上述的處理結果為:
30 0 0 31 0 0 32 0 23 0 0 14 0 0 15 0 0 26 0 16 0 0 28 0 17 0 0 18 0 19如果將 push_back 的代碼改為如下所示:
void push_back(const int &data) {pthread_mutex_lock(&mtx_);data_[size] = data;usleep(10);size++;pthread_mutex_unlock(&mtx_); }?則結果如下所示:
10 20 30 11 21 12 31 13 22 32 23 14 33 15 24 16 25 34 26 17 35 27 36 18 28 19 37 29 38 39該結果是正確的,所以后面的代碼中 push_back 是線程安全的。
?
(SAW:Game Over!)
總結
以上是生活随笔為你收集整理的如何判断一个类是否是线程安全(可重入)的?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C/Cpp / STL / map 的
- 下一篇: Linux IPC / 分类