安阳做一个网站多少钱,河南省级住房城乡建设主管部门网站,济南小程序开发,广告设计公司英文介绍一#xff1a;概述 线程同步是多线程编程中的一个重要概念#xff0c;它用于控制多个线程之间对共享资源的访问#xff0c;避免竞态条件#xff08;race condition#xff09;和数据不一致的问题。线程同步确保在多线程环境中#xff0c;多个线程访问共享数据时能够按照某…一概述 线程同步是多线程编程中的一个重要概念它用于控制多个线程之间对共享资源的访问避免竞态条件race condition和数据不一致的问题。线程同步确保在多线程环境中多个线程访问共享数据时能够按照某种预定的顺序或规则进行以保证程序的正确性和稳定性。
二线程同步方法 1. 信号量 #include iostream
#include semaphore
#include thread
#include vectorstd::vectorint myVec{};std::counting_semaphore1 prepareSignal(0);void prepareWork() {myVec.insert(myVec.end(), {0, 1, 0, 3});std::cout Sender: Data prepared. \n;prepareSignal.release();
}void completeWork() {std::cout Waiter: Waiting for data. \n;prepareSignal.acquire();myVec[2] 2;std::cout Waiter: Complete the work. \n;for (auto i: myVec) std::cout i ;std::cout \n;}int main() {std::cout \n;std::thread t1(prepareWork);std::thread t2(completeWork);t1.join();t2.join();std::cout \n;} 2. 条件变量
#include iostream
#include condition_variable
#include mutex
#include thread
#include vectorstd::mutex mut;
std::condition_variable condVar;std::vectorint myVec{};void prepareWork() { {std::lock_guardstd::mutex lck(mut);myVec.insert(myVec.end(), {0, 1, 0, 3}); }std::cout Sender: Data prepared. \n;condVar.notify_one();
}void completeWork() { std::cout Waiter: Waiting for data. \n;std::unique_lockstd::mutex lck(mut);condVar.wait(lck, [] { return not myVec.empty(); });myVec[2] 2; std::cout Waiter: Complete the work. \n;for (auto i: myVec) std::cout i ;std::cout \n;}int main() {std::cout \n;std::thread t1(prepareWork);std::thread t2(completeWork);t1.join();t2.join();std::cout \n;} 3. Atomic #include atomic
#include iostream
#include thread
#include vectorstd::vectorint myVec{};std::atomicbool atomicBool{false};void prepareWork() {myVec.insert(myVec.end(), {0, 1, 0, 3});std::cout Sender: Data prepared. \n;atomicBool.store(true);atomicBool.notify_one();}void completeWork() {std::cout Waiter: Waiting for data. \n;atomicBool.wait(false); myVec[2] 2;std::cout Waiter: Complete the work. \n;for (auto i: myVec) std::cout i ;std::cout \n;}int main() {std::cout \n;std::thread t1(prepareWork);std::thread t2(completeWork);t1.join();t2.join();std::cout \n;} 4. Promise - Feature
#include iostream
#include future
#include thread
#include vectorstd::vectorint myVec{};void prepareWork(std::promisevoid prom) {myVec.insert(myVec.end(), {0, 1, 0, 3});std::cout Sender: Data prepared. \n;prom.set_value(); }void completeWork(std::futurevoid fut){std::cout Waiter: Waiting for data. \n;fut.wait(); myVec[2] 2;std::cout Waiter: Complete the work. \n;for (auto i: myVec) std::cout i ;std::cout \n;}int main() {std::cout \n;std::promisevoid sendNotification;auto waitForNotification sendNotification.get_future();std::thread t1(prepareWork, std::move(sendNotification));std::thread t2(completeWork, std::move(waitForNotification));t1.join();t2.join();std::cout \n;}