C++ 中的多线程编程和同步机制使得程序员能够利用计算机的多外围来进步程序的运行效率和性能。本文将介绍多线程编程和同步机制的基本概念和应用办法。
多线程编程根底
在 C ++ 中,应用 <thread>
库来创立和治理线程。线程能够通过函数、成员函数或者 Lambda
表达式来实现。以下是一个应用 Lambda
表达式来创立线程的例子:
#include <thread>
#include <iostream>
int main() {std::thread t([](){std::cout << "Hello from thread" << std::this_thread::get_id() << std::endl;
});
t.join();
return 0;
}
上述代码创立了一个线程并输入了该线程的 ID
。在创立线程时,须要将线程函数作为参数传递给std::thread
。在上述例子中,咱们应用了Lambda
表达式来定义线程函数,该表达式会输入一行文本。
同步机制
多线程编程中最常见的问题是数据竞争和死锁。为了防止这些问题,咱们须要应用同步机制来控制线程的拜访。
互斥量
互斥量是 C ++ 中最罕用的同步机制之一。互斥量能够保障同一时间只有一个线程能够访问共享资源。以下是一个应用互斥量来爱护共享资源的例子:
#include <thread>
#include <mutex>
#include <iostream>
std::mutex mtx;
void thread_func() {mtx.lock();
std::cout << "Hello from thread" << std::this_thread::get_id() << std::endl;
mtx.unlock();}
int main() {std::thread t1(thread_func);
std::thread t2(thread_func);
t1.join();
t2.join();
return 0;
}
上述代码创立了两个线程,并应用互斥量来爱护共享资源。在线程函数中,咱们先调用 mtx.lock()
函数来锁定互斥量,而后访问共享资源,最初再调用 mtx.unlock()
函数来开释互斥量。在上述例子中,咱们应用了两个线程来访问共享资源,然而只有一个线程能够拜访该资源。这是因为在一个线程访问共享资源时,该资源会被锁定,其余线程无法访问该资源,直到该线程开释互斥量为止。
条件变量
条件变量是 C ++ 中另一个罕用的同步机制。条件变量能够让线程在某些条件满足时才继续执行,否则就期待。以下是一个应用条件变量来同步线程的例子:
#include <thread>
#include <mutex>
#include <condition_variable>
#include <iostream>
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
void consumer() {std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [](){ return ready;});
std::cout << "Hello from consumer thread" << std::this_thread::get_id() << std::endl;}
void producer() {std::this_thread::sleep_for(std::chrono::seconds(1));
ready = true;
cv.notify_one();}
int main() {std::thread t1(consumer);
std::thread t2(producer);
t1.join();
t2.join();
return 0;
}
上述代码创立了两个线程,一个生产者线程和一个消费者线程。生产者线程在 1 秒后将 ready
变量设置为 true
,而后告诉消费者线程继续执行。消费者线程期待条件变量cv
,直到ready
变量的值为 true
为止。在该例子中,咱们应用了条件变量来同步生产者和消费者线程。
论断
多线程编程和同步机制是 C ++ 中十分重要的主题。本文介绍了多线程编程的基本概念和应用办法,以及互斥量和条件变量等罕用的同步机制。心愿这篇文章对你有所帮忙。