legongju.com
我们一直在努力
2025-01-13 10:16 | 星期一

从C++ Cookbook学习多线程编程

《C++ Cookbook》是一本关于C++编程的实用教程,其中包含了许多关于多线程编程的示例和解释

  1. 包含头文件:在使用C++的线程库之前,需要包含头文件。
#include
#include
  1. 创建线程:使用std::thread类创建一个新线程。将要执行的函数作为参数传递给std::thread对象。
void myFunction() {
    // 在这里执行你的任务
}

int main() {
    std::thread t(myFunction); // 创建一个新线程并执行myFunction
    t.join(); // 等待线程完成
    return 0;
}
  1. 传递参数给线程函数:如果你的函数需要参数,可以在创建std::thread对象时传递这些参数。
void myFunctionWithArgs(int a, int b) {
    // 在这里执行你的任务
}

int main() {
    std::thread t(myFunctionWithArgs, 10, 20); // 创建一个新线程并执行myFunctionWithArgs
    t.join(); // 等待线程完成
    return 0;
}
  1. 线程同步:当多个线程需要访问共享资源时,需要使用互斥锁(std::mutex)来确保同一时间只有一个线程可以访问资源。
#include 

std::mutex mtx; // 全局互斥锁

void threadFunction() {
    mtx.lock(); // 加锁
    // 访问共享资源
    mtx.unlock(); // 解锁
}

int main() {
    std::thread t1(threadFunction);
    std::thread t2(threadFunction);
    t1.join();
    t2.join();
    return 0;
}
  1. 使用std::unique_lock简化互斥锁的使用:std::unique_lock可以自动管理互斥锁的加锁和解锁操作,从而简化代码。
#include 

std::mutex mtx; // 全局互斥锁

void threadFunction() {
    std::unique_lock lock(mtx); // 自动加锁
    // 访问共享资源
    // 自动解锁
}

int main() {
    std::thread t1(threadFunction);
    std::thread t2(threadFunction);
    t1.join();
    t2.join();
    return 0;
}
  1. 使用条件变量(std::condition_variable)实现线程间的同步:条件变量允许一个或多个线程等待,直到另一个线程通知它们。
#include

std::mutex mtx;
std::condition_variable cv;
bool ready = false;

void print_id() {
    std::unique_lock lck(mtx);
    while (!ready) { // 如果ready为false,则等待
        cv.wait(lck); // 当前线程被阻塞,等待条件变量被通知
    }
    // 打印线程ID
    std::cout << "thread "<< std::this_thread::get_id() << '\n';
}

void go() {
    std::unique_lock lck(mtx);
    ready = true; // 修改共享变量
    cv.notify_all(); // 通知所有等待的线程
}

int main() {
    std::thread threads[10];
    for (auto& th : threads) {
        th = std::thread(print_id);
    }

    std::cout << "10 threads ready to race...\n";
    go(); // 启动竞争

    for (auto& th : threads) {
        th.join();
    }

    return 0;
}

这些示例仅涵盖了C++多线程编程的基本概念。在实际应用中,你可能还需要处理更复杂的场景,如线程池、原子操作、锁无关编程等。建议你深入研究C++标准库中的线程支持,以便更好地理解和应用多线程编程。

未经允许不得转载 » 本文链接:https://www.legongju.com/article/106222.html

相关推荐

  • 在c++中cbegin适用于哪些场景

    在c++中cbegin适用于哪些场景

    cbegin() 是 C++11 标准库中的一个函数,它返回一个指向容器开始位置的常量迭代器(const_iterator)。这意味着你不能通过这个迭代器修改容器中的元素。cbegin()...

  • c++ cbegin能提高程序性能吗

    c++ cbegin能提高程序性能吗

    cbegin() 是 C++11 标准中引入的一个成员函数,用于返回容器的常量迭代器,指向容器的第一个元素。使用 cbegin() 本身并不会直接提高程序性能,但它可以帮助你编...

  • c++中使用cbegin有哪些注意事项

    c++中使用cbegin有哪些注意事项

    在C++中,cbegin()和cend()是C++11引入的函数,用于获取容器的常量迭代器(const_iterator),这意味着你不能通过这些迭代器修改容器的内容 确保容器支持cbegin(...

  • c++ cbegin与普通迭代器有何区别

    c++ cbegin与普通迭代器有何区别

    cbegin() 和普通迭代器(例如 begin())之间的主要区别在于它们返回的迭代器类型 cbegin():此成员函数返回一个常量迭代器(const_iterator),表示容器的开始位...

  • 全局配置文件在C#中的应用场景

    全局配置文件在C#中的应用场景

    在C#中,全局配置文件主要用于存储和管理应用程序的配置信息,例如数据库连接字符串、API密钥、文件路径等。这些配置信息可能在整个应用程序中被多个类和方法使用...

  • C#中Global关键字的最佳实践是什么

    C#中Global关键字的最佳实践是什么

    在C#中,global关键字通常与别名一起使用,以引用全局命名空间。这在处理类型名称冲突或引用不同程序集中的类型时非常有用。然而,在实际编程中,我们应该尽量避...

  • 如何在C#中定义全局常量

    如何在C#中定义全局常量

    在C#中,您可以通过使用public static readonly或const关键字来定义全局常量
    方法1:使用public static readonly定义全局常量:
    public class Constan...

  • C# Global静态类的使用注意事项

    C# Global静态类的使用注意事项

    在C#中,静态类(static class)是一种特殊的类,它只能包含静态成员(如静态方法、静态属性和静态字段)。静态类不能被实例化,因此在使用时需要注意以下几点:...