一、c lock作用
c++lock是一種線程同步機制,用於保護共享資源的訪問。在多線程環境下,如果多個線程同時訪問了同一份數據,就會導致數據不一致的問題。通過使用c++lock,我們可以保證同一時間只有一個線程能夠訪問共享資源,從而避免了數據不一致的問題。
二、c lock用法
c++lock的用法非常簡單。我們只需要在訪問共享資源之前,通過lock()函數鎖定共享資源,訪問完成後再通過unlock()函數釋放鎖即可。下面是一段示例代碼:
#include #include #include using namespace std; int g_num = 0; // 共享資源 mutex g_mutex; // 鎖對象 void func() { // 鎖定共享資源 g_mutex.lock(); // 訪問共享資源 cout << "Thread ID: " << this_thread::get_id() < " << ++g_num << endl; // 釋放鎖 g_mutex.unlock(); } int main() { thread t1(func); thread t2(func); t1.join(); t2.join(); return 0; }
三、c lock 參數
c++lock有3種不同的鎖類型:unique_lock、lock_guard和defer_lock。其中unique_lock是最靈活的一種,支持鎖定和解鎖多次,而lock_guard則是最簡單的一種,只支持一次性鎖定。defer_lock則是延遲鎖定,即先不鎖定,等到需要訪問共享資源時再鎖定。下面是一段使用defer_lock參數的示例代碼:
#include #include #include using namespace std; int g_num = 0; // 共享資源 mutex g_mutex; // 鎖對象 void func() { // 延遲鎖定 unique_lock lock(g_mutex, defer_lock); // 訪問共享資源前先鎖定 lock.lock(); // 訪問共享資源 cout << "Thread ID: " << this_thread::get_id() < " << ++g_num << endl; // 解鎖 lock.unlock(); } int main() { thread t1(func); thread t2(func); t1.join(); t2.join(); return 0; }
四、c lock this
c++lock使用this鎖定時,需要注意避免出現多線程死鎖的問題。如果在一個函數中多次鎖定this指針,就會出現死鎖的問題。下面是一段可能導致死鎖的示例代碼:
#include #include #include using namespace std; class Test { public: Test() : m_num(0) {} void func() { // 第一次鎖定this指針 m_mutex.lock(); // 第二次鎖定this指針,會導致死鎖 this->m_mutex.lock(); // 訪問共享資源 cout << "Thread ID: " << this_thread::get_id() < " << ++m_num << endl; // 解鎖 m_mutex.unlock(); } private: int m_num; // 共享資源 mutex m_mutex; // 鎖對象 }; int main() { Test t; thread t1(&Test::func, &t); thread t2(&Test::func, &t); t1.join(); t2.join(); return 0; }
五、c lock 無效
c++lock可能會無效的一種情況是,不同線程使用了不同的mutex對象。因為不同的mutex對象無法鎖定同一個共享資源,所以c++lock就會無效。下面是一段可能導致c++lock無效的示例代碼:
#include #include #include using namespace std; int g_num = 0; // 共享資源 mutex g_mutex1; // 鎖對象1 mutex g_mutex2; // 鎖對象2 void func() { // 使用了不同的mutex對象,無法鎖定同一份共享資源 unique_lock lock(g_mutex1); // 訪問共享資源 cout << "Thread ID: " << this_thread::get_id() < " << ++g_num << endl; // 解鎖 lock.unlock(); } int main() { thread t1(func); thread t2(func); t1.join(); t2.join(); return 0; }
六、c lock 參數要求
c++lock對鎖對象的要求非常嚴格,必須保證所有訪問共享資源的線程都使用同一份mutex對象。否則就會出現線程競爭的問題,導致數據不一致。下面是一段使用了不同mutex對象的示例代碼:
#include #include #include using namespace std; int g_num = 0; // 共享資源 mutex g_mutex1; // 鎖對象1 mutex g_mutex2; // 鎖對象2 void func1() { // 使用了不同的mutex對象,會導致線程競爭問題 unique_lock lock(g_mutex1); // 訪問共享資源 cout << "Thread ID: " << this_thread::get_id() < " << ++g_num << endl; // 解鎖 lock.unlock(); } void func2() { // 使用了不同的mutex對象,會導致線程競爭問題 unique_lock lock(g_mutex2); // 訪問共享資源 cout << "Thread ID: " << this_thread::get_id() < " << ++g_num << endl; // 解鎖 lock.unlock(); } int main() { thread t1(func1); thread t2(func2); t1.join(); t2.join(); return 0; }
七、clock
c++中的clock函數用於測量程序運行的時間。clock函數返回從程序開始運行起,處理器時鐘所需的時間(以時鐘周期為單位)。下面是一段使用clock函數測量程序運行時間的示例代碼:
#include #include using namespace std; int main() { clock_t start_time = clock(); // 記錄程序開始時間 // 執行代碼段 for(int i=0; i<10000000; i++); clock_t end_time = clock(); // 記錄程序結束時間 double total_time = static_cast(end_time - start_time) / CLOCKS_PER_SEC; // 計算總時間 cout << "程序運行時間:" << total_time << " 秒" << endl; return 0; }
八、cblock
c++中的cblock語法和c++lock非常相似,都用於保護共享資源。cblock語法本質上是一種代碼塊,可以在代碼塊前後使用宏定義來自動加鎖和解鎖。下面是一段使用cblock保護共享資源的示例代碼:
#include #include #include using namespace std; int g_num = 0; // 共享資源 mutex g_mutex; // 鎖對象 #define C_BLOCK(mutex) for(unique_lock lock(mutex); true; lock.unlock()) // 宏定義,用於加鎖和解鎖 void func() { C_BLOCK(g_mutex) { // 訪問共享資源 cout << "Thread ID: " << this_thread::get_id() < " << ++g_num << endl; } } int main() { thread t1(func); thread t2(func); t1.join(); t2.join(); return 0; }
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/296067.html