C 11 下的執行緒安全模板物件

2021-07-16 08:18:27 字數 3737 閱讀 2366

c++11標準下我們可以更加簡單地呼叫執行緒,但是執行緒呼叫就必須注意物件執行緒安全的問題。

我們可以用智慧型指標簡單地去解決物件執行緒安全問題,我嘗試了解什麼叫智慧型指標,但是最後由於腦子不夠用壓根不懂他在說什麼鬼,所以我嘗試自己寫個執行緒安全的容器。

這個執行緒容器使用的是c++11的一些新特性去實現的,所以不要嘗試用vc6神器去編譯。

首先需要用到模板類而不是繼承,因為使用模板才能確保我不用再去為這件破事而煩惱。

csafemap.hpp

#include

#include

#include

using namespace std;

typedef enum encsafemapstatus;//定義個列舉狀態

template

class csafeobject

csafeobject(const csafeobject& cc)

virtual ~csafeobject(void)

public:

bool createobject(std::functionfunc)

void ctrlitem(std::functionfunc)

func(m_data); //呼叫物件

bret = true;

} while (bret == false);

}void delete(std::functionfunc = (t1&itr) )

func(m_data);

bret = true;

} while (bret == false);

}private:

t1 m_data;//需要在多個執行緒中使用到的物件

int m_mark;//狀態計數器

std::mutex m_mtx;//鎖

};例子:

int main()

csafeobjectstrdata;

strdata.createobject((cstring&tm)->bool );

thread th1([&]() );

this_thread::sleep_for(chrono::microseconds(1));

} while (1);

});thread th2([&]() );

this_thread::sleep_for(chrono::microseconds(2));

} while (1);

});thread th3([&]() );

this_thread::sleep_for(chrono::microseconds(3));

} while (1);

});thread th4([&]() );

this_thread::sleep_for(chrono::microseconds(4));

} while (1);

});th1.detach();

th2.detach();

th3.detach();

th4.detach();

strdata.delete((cstring&itr){});//釋放物件,因為不是new出來的所以在這裡載入乙個函式釋放物件

這個容器很賤單,就是鎖上物件然後操作物件,這裡我使用了模板類,std::function,std::mutex,std::lock_guard和lambel

表示式去實現這個執行緒安全的模板。如果我們使用多個物件時這個類的簡便性就越明顯,畢竟不在需要去擔心鎖有沒有釋放,那一把鎖負責那個變數的問題,不過需要注意的是不要巢狀使用ctrlitem,需要呼叫到多個物件的時候應使用拷貝物件的方式即:

cstring str1;

strdata_1.ctrlitem((cstring&tm) );

strdata_2.ctrlitem((cstring&tm) );

#pragma once

#include

#include

using namespace std;

#ifndef logstrnor

#define logstrnor(str,...)  }

#endif

template

class csafeitems

csafeitems(const csafeitems& cc)

virtual ~csafeitems(void)

public:

int fillitems(int ncount, std::functionfunc)

}return m_data.size();

}void ctrlitem(std::functionfunc)

func(t1);

bret = true;

} while (bret == false);

}void updateitem(std::functionfunc, std::functionfuncfinished)

while (data.size())

funcfinished();

break;}}

::sleep(1);

} while (1);

}void removeall()

break;}}

::sleep(1);

} while (1);

}void deleteall(std::functionfunc = (t1&itr) )

break;}}

::sleep(1);

} while (1);

}int getsize()

private:

queuem_data;

std::mutex m_mtx;

int m_nmax;

};#define def原子操作(x)  \

\x;                                      \

lock_stream->clear();                  \

if(n>0)   \

}#define connection(text1,text2) text1##text2

#define connect(text1,text2) connection(text1,text2)

#define initatom(tm) \

static int ntick = 0;

#include

template

class catomicobject

catomicobject(const catomicobject& cc)

virtual ~catomicobject(void)

void init(cstring strmark, std::atomic_flag*lock)

public:

void createobject(std::functionfunc)

bool createobject(std::functionfunc)

bool createobject(cstring strmark,std::functionfunc)

void ctrlitem(std::functionfunc)

void delete(std::functionfunc = (t1&itr) )

private:

t1 m_data;

std::atomic_flag*lock_stream;

cstring m_strmark;

};

c 11多執行緒程式設計 執行緒安全佇列

c11正式引入了自己的執行緒類,讓c 的多執行緒程式設計變的更加優雅。由於不同的編譯器對新特性的支援有所差異,這裡的 都是在gcc 4.8版本下編譯執行。涉及到的c 11的知識如下 thread 執行緒庫同步和互斥有關量 mutex和condition variable簡單的資源管理類 lock g...

C 11 模板的改進

在c 98 03的泛型程式設計中,模板例項化有乙個很繁瑣的地方,就是連續兩個右尖括號 會被編譯解釋成右移操作符,而不是模板參數列的形式,需要乙個空格進行分割,以避免發生編譯時的錯誤。template class x template class y int main 在例項化模板時會出現連續兩個右尖...

c 11模板的特化

前面定義的stack中,第二個模板引數要求支援back,push back,pop back等介面。如果我們已經有乙個自定義的容器array,它的定義如下 template struct array array只有put和get介面,並輔助以index引數進行元素訪問。為了讓array也能參與實現s...