c++ 线程使用
C++中的线程可以通过标准库提供的thread类实现。该类提供了创建和管理线程的方法和函数。
创建线程的方法:
#include <thread>
...
// 创建一个线程,其执行函数为func1,传递参数为arg1
std::thread t1(func1, arg1);
// 创建一个线程,其执行函数为func2
std::thread t2(func2);
// 等待t1执行完毕
t1.join();
// 等待t2执行完毕
t2.join();
上述代码中,func1和func2代表函数指针,arg1是传递给func1的参数,t1和t2是线程对象,join()方法用于等待线程执行完毕。
线程函数的定义:
线程函数可以是任何可调用对象,包括函数指针、函数对象、lambda表达式等。线程函数的实现需要注意线程安全问题。
#include <iostream>
#include <thread>
void worker(int id)
{
std::cout << "Worker " << id << " is starting..." << std::endl;
// 执行任务
std::cout << "Worker " << id << " is finished." << std::endl;
}
int main()
{
std::thread t1(worker, 1);
std::thread t2(worker, 2);
// 等待t1执行完毕
t1.join();
// 等待t2执行完毕
t2.join();
return 0;
}
如上述代码所示,worker函数用于执行具体的任务,通过std::thread对象创建线程,将worker函数作为线程执行函数,并传入参数,通过join()方法等待线程执行完毕。
线程的同步与互斥:
在多线程程序中,很容易出现多个线程同时访问同一个数据或资源的情况,这时就需要对线程进行同步和互斥操作,以避免数据竞争等问题。
在C++中,提供了一些同步和互斥的机制,如:互斥锁、条件变量、原子操作等。
#include <iostream>
#include <thread>
#include <mutex>
std::mutex m;
void worker(int id)
{
// 加锁
m.lock();
std::cout << "Worker " << id << " is starting..." << std::endl;
// 执行任务
std::cout << "Worker " << id << " is finished." << std::endl;
// 解锁
m.unlock();
}
int main()
{
std::thread t1(worker, 1);
std::thread t2(worker, 2);
// 等待t1执行完毕
t1.join();
// 等待t2执行完毕
t2.join();
return 0;
}
如上述代码所示,为线程添加互斥锁可以避免多个线程同时访问同一个数据或资源的问题,执行互斥锁加锁和解锁操作就可以实现线程之间的同步和互斥。
总结:
C++中提供了thread类实现线程的创建和管理,线程函数可以是任何可调用对象。在多线程编程中,需要注意线程安全问题,可以通过互斥锁、条件变量等机制实现线程之间的同步和互斥。