在 Ubuntu 上写 C++ 多线程,一般有两种常见方式:
下面分别说明,并给出可运行示例。
std::thread(推荐)Ubuntu 一般自带 g++,确认版本:
g++ --version
建议 g++ ≥ 4.8(支持 C++11)
#include <iostream>
#include <thread>
void threadFunc(int id) {
std::cout << "Thread " << id << " is running\n";
}
int main() {
std::thread t1(threadFunc, 1);
std::thread t2(threadFunc, 2);
t1.join();
t2.join();
std::cout << "Main thread done\n";
return 0;
}
g++ -std=c++11 -pthread main.cpp -o main
./main
-pthread是必须的,用于链接线程库
#include <iostream>
#include <pthread.h>
void* threadFunc(void* arg) {
int id = *(int*)arg;
std::cout << "Thread " << id << " is running\n";
return nullptr;
}
int main() {
pthread_t t1, t2;
int id1 = 1, id2 = 2;
pthread_create(&t1, nullptr, threadFunc, &id1);
pthread_create(&t2, nullptr, threadFunc, &id2);
pthread_join(t1, nullptr);
pthread_join(t2, nullptr);
std::cout << "Main thread done\n";
return 0;
}
g++ main.cpp -o main -pthread
std::mutex#include <mutex>
std::mutex mtx;
void safePrint(int id) {
mtx.lock();
std::cout << "Thread " << id << "\n";
mtx.unlock();
}
或用:
std::lock_guard<std::mutex> lock(mtx);
#include <condition_variable>
std::condition_variable cv;
bool ready = false;
// 等待
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []{ return ready; });
// 通知
ready = true;
cv.notify_all();
std::threadmutex / condition_variableasync / 线程池如果你愿意,我可以:
你更想学哪一块?