c11 thread的使用
时间: 2023-10-25 10:11:06 浏览: 51
c11引入了<thread>库,其中提供了thread类,用于创建和使用线程。通过实例化thread类的对象,可以创建一个线程,并进行线程的操作。使用线程主要包括线程的创建和使用、实现线程同步等几个方面。
1.1 创建线程可以通过实例化thread对象并传入相应的函数或函数对象作为参数来实现。例如:
```cpp
#include <iostream>
#include <thread>
void threadFunc() {
// 线程执行的函数
}
int main() {
std::thread t(threadFunc); // 创建线程,并指定执行的函数
t.join(); // 等待线程执行完成
return 0;
}
```
1.2 线程的使用主要包括线程的启动、等待线程结束、检查线程是否可被加入等操作。例如:
```cpp
#include <iostream>
#include <thread>
void threadFunc() {
// 线程执行的函数
}
int main() {
std::thread t(threadFunc);
if (t.joinable()) {
t.join(); // 等待线程执行完成
}
return 0;
}
```
2. 实现线程同步可以使用互斥锁(mutex)和条件变量(condition_variable)等机制。互斥锁用于保护共享资源的访问,条件变量则用于线程之间的通信和同步。例如:
```cpp
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx; // 互斥锁
void threadFunc() {
std::unique_lock<std::mutex> lock(mtx); // 上锁
// 线程执行的函数
lock.unlock(); // 解锁
}
int main() {
std::thread t(threadFunc);
if (t.joinable()) {
t.join(); // 等待线程执行完成
}
return 0;
}
```
3. 例1:两线程交替打印奇偶数。这个例子演示了如何使用两个线程交替打印奇偶数。具体的实现可以参考以下代码:
```cpp
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx; // 互斥锁
std::condition_variable cv; // 条件变量
int count = 1;
void printOdd() {
while (count <= 10) {
std::unique_lock<std::mutex> lock(mtx);
while (count % 2 == 0) {
cv.wait(lock); // 等待偶数线程唤醒
}
std::cout << "Odd: " << count << std::endl;
count++;
lock.unlock();
cv.notify_all(); // 唤醒偶数线程
}
}
void printEven() {
while (count <= 10) {
std::unique_lock<std::mutex> lock(mtx);
while (count % 2 != 0) {
cv.wait(lock); // 等待奇数线程唤醒
}
std::cout << "Even: " << count << std::endl;
count++;
lock.unlock();
cv.notify_all(); // 唤醒奇数线程
}
}
int main() {
std::thread t1(printOdd);
std::thread t2(printEven);
if (t1.joinable()) {
t1.join(); // 等待奇数线程执行完成
}
if (t2.joinable()) {
t2.join(); // 等待偶数线程执行完成
}
return 0;
}
```