現象:
(1)單執行緒無鎖速度最快,但應用場合受限;
(2)多執行緒無鎖速度第二快,但結果不對,未保護臨界**段;
(3)多執行緒原子鎖第三快,且結果正確;
(4)多執行緒互斥量較慢,慢與原子鎖近10倍,結果正確;
(5)多執行緒自旋鎖最慢,慢與原子鎖30倍,結果正確。
結論:原子鎖速度最快,互斥量和自旋鎖都用保護多執行緒共享資源。
自旋鎖是一種非阻塞鎖,也就是說,如果某執行緒需要獲取自旋鎖,但該鎖已經被其他執行緒占用時,該執行緒不會被掛起,而是在不斷的消耗cpu的時間,不停的試圖獲取自旋鎖。
互斥量是阻塞鎖,當某執行緒無法獲取互斥量時,該執行緒會被直接掛起,該執行緒不再消耗cpu時間,當其他執行緒釋放互斥量後,作業系統會啟用那個被掛起的執行緒,讓其投入執行。
在多處理器環境中對持有鎖時間較短的程式來說使用自旋鎖代替一般的互斥鎖往往能提高程式的效能,但是本**無該效果。
#include #include #include #include #include class spin_mutex
void unlock()
};long size = 1000000;
long total = 0;
std::atomic_long total2(0);
std::mutex m;
spin_mutex lock;
void thread_click()
}void mutex_click()
}void atomic_click()
}void spinlock_click()
}int main()
end = clock();
std::cout << "single thread result: " << total << std::endl;
std::cout << "single thread time: " << end - start << std::endl;
total = 0;
start = clock();
for (int i = 0; i < thnum; ++i)
for (int i = 0; i < thnum; ++i)
end = clock();
std::cout << "multi thread no mutex result: " << total << std::endl;
std::cout << "multi thread no mutex time: " << end - start << std::endl;
total = 0;
start = clock();
for (int i = 0; i < thnum; ++i)
for (int i = 0; i < thnum; ++i)
end = clock();
std::cout << "multi thread atomic result: " << total2 << std::endl;
std::cout << "multi thread atomic time: " << end - start << std::endl;
total = 0;
start = clock();
for (int i = 0; i < thnum; ++i)
for (int i = 0; i < thnum; ++i)
end = clock();
std::cout << "multi thread mutex result: " << total << std::endl;
std::cout << "multi thread mutex time: " << end - start << std::endl;
total = 0;
start = clock();
for (int i = 0; i < thnum; ++i)
for (int i = 0; i < thnum; ++i)
end = clock();
std::cout << "spin lock result: " << total << std::endl;
std::cout << "spin lock time: " << end - start << std::endl;
getchar();
return 0;}/*
single thread result: 100000000
single thread time: 231
multi thread no mutex result: 11501106
multi thread no mutex time: 261
multi thread atomic result: 100000000
multi thread atomic time: 1882
multi thread mutex result: 100000000
multi thread mutex time: 16882
spin lock result: 100000000
spin lock time: 45063
*/
自旋鎖,訊號量,互斥鎖比較
為了避免併發,防止競爭。核心提供了一組同步方法來提供對共享資料的保護。我們的重點不是介紹這些方法的詳細用法,而是強調為什麼使用這些方法和它們之間的差別。linux使用的同步機制可以說從2.0到2.6以來不斷發展完善。從最初的原子操作,到後來的訊號量,從大核心鎖到今天的自旋鎖。這些同步機制的發展伴隨l...
自旋鎖,互斥鎖,訊號量
自旋鎖,互斥鎖,訊號量 樂觀鎖和悲觀鎖只是一種理論,是從思想上劃分的。自旋鎖和互斥鎖是應用層確確實實的鎖,用於同步訪問控制 如果一定要劃分,從只有乙個執行緒可以擁有鎖來說,我覺得自旋鎖和互斥鎖應該都屬於悲觀鎖,因為一般的應用不需要支援事物回滾的操作。但是沈詢的直播中說,互斥鎖屬於悲觀鎖 sleep ...
訊號量,互斥鎖,自旋鎖
個人理解 訊號量 程序間的通訊機制 單一個數的訊號 與訊息郵箱,訊息佇列,機理類同,量不同,用訊號量肯定掉cpu 自旋鎖 保護區域不掉cpu,持續查詢,等待 不可用時域長狀態 切記 時域範圍 在程序間的通訊機制函式狀態 鎖 0 互斥鎖與自旋鎖 互斥鎖 執行緒會從sleep 加鎖 running 解鎖...