主要搜索引擎网站搜索结果比较,设计一套网站费用,免费下载官方百度,wordpress门户型多栏设计引言
随着多核处理器的普及#xff0c;利用多线程编程来提升应用程序性能变得越来越重要。C11 标准库引入了一系列用于多线程编程的API#xff0c;使得多线程编程变得更加简洁和高效。
一、基本概念
在开始编写多线程代码之前#xff0c;了解一些基本概念是非常重要的利用多线程编程来提升应用程序性能变得越来越重要。C11 标准库引入了一系列用于多线程编程的API使得多线程编程变得更加简洁和高效。
一、基本概念
在开始编写多线程代码之前了解一些基本概念是非常重要的
线程线程是操作系统能够调度的最小执行单元。一个进程可以包含多个线程这些线程共享进程的资源但可以独立执行。并行和并发并行是指多个线程同时执行而并发是指多个线程在同一时间段内交替执行。
二、创建和管理线程
C11标准库提供了std::thread类来创建和管理线程。我们可以通过以下几种方式创建线程
1. 创建线程
1使用函数指针
#include iostream
#include threadvoid threadFunction() {std::cout Hello from thread!\n;
}int main() {std::thread t(threadFunction);t.join(); // 等待线程t完成return 0;
}2使用lambda表达式
#include iostream
#include threadint main() {std::thread t([]{std::cout Hello from lambda thread!\n;});t.join();return 0;
}3使用成员函数
#include iostream
#include threadclass MyClass {
public:void memberFunction() {std::cout Hello from member function thread!\n;}
};int main() {MyClass obj;std::thread t(MyClass::memberFunction, obj);t.join();return 0;
}2. 线程同步
在多线程编程中同步是一个关键问题C11 提供了多种同步机制包括互斥量(std::mutex)、锁(std::lock_guard 和 std::unique_lock)、条件变量(std::condition_variable)等。
1互斥量
互斥量用于保护共享数据防止数据竞争。
#include iostream
#include thread
#include mutexstd::mutex mtx;void printMessage(const std::string msg) {std::lock_guardstd::mutex lock(mtx);std::cout msg std::endl;
}int main() {std::thread t1(printMessage, Hello from thread 1);std::thread t2(printMessage, Hello from thread 2);t1.join();t2.join();return 0;
}2条件变量
条件变量用于线程间的通知机制。
#include iostream
#include thread
#include mutex
#include condition_variablestd::mutex mtx;
std::condition_variable cv;
bool ready false;void printMessage() {std::unique_lockstd::mutex lock(mtx);cv.wait(lock, []{ return ready; });std::cout Thread is running!\n;
}int main() {std::thread t(printMessage);{std::lock_guardstd::mutex lock(mtx);ready true;}cv.notify_one();t.join();return 0;
}3. 线程局部存储
C11 提供了 thread_local 关键字用于定义线程局部变量。
#include iostream
#include threadthread_local int threadId 0;void printThreadId(int id) {threadId id;std::cout Thread ID: threadId std::endl;
}int main() {std::thread t1(printThreadId, 1);std::thread t2(printThreadId, 2);t1.join();t2.join();return 0;
}4. 其他API
1std::async 和 std::future
std::async 用于异步执行任务并返回一个 std::future 对象用于获取异步任务的结果。
#include iostream
#include futureint asyncFunction() {return 42;
}int main() {std::futureint result std::async(std::launch::async, asyncFunction);std::cout Async result: result.get() std::endl;return 0;
}2std::packaged_task
std::packaged_task 也用于异步执行任务但它允许将任务包装成一个可调用对象并与 std::future 关联。
#include iostream
#include futureint taskFunction() {return 42;
}int main() {std::packaged_taskint() task(taskFunction);std::futureint result task.get_future();std::thread(std::move(task)).detach();std::cout Task result: result.get() std::endl;return 0;
}三、总结
C11 标准库提供了一套强大而简洁的多线程编程API极大地简化了多线程编程的复杂性。通过 std::thread 类我们可以方便地创建和管理线程通过互斥量和条件变量等同步机制我们可以有效地避免数据竞争通过 std::async 和 std::future 等工具我们可以轻松地实现异步编程。这些工具不仅适用于Windows环境也适用于其他平台使得我们的代码具有良好的可移植性。
更多详细代码C11多线程编程: Windows下C11多线程编程