C++主线程循环创建子线程
时间: 2023-08-30 07:04:10 浏览: 134
可以使用C++11中的std::thread来创建子线程,主线程中可以使用循环来不断创建子线程。具体的代码如下所示:
```c++
#include <thread>
#include <iostream>
void thread_func(int id) {
std::cout << "Thread " << id << " is running." << std::endl;
}
int main() {
for (int i = 0; i < 10; i++) {
std::thread t(thread_func, i);
t.detach(); // 分离线程
}
// 主线程继续执行其他任务
std::cout << "Main thread is done." << std::endl;
return 0;
}
```
上述代码在主线程中循环创建了10个子线程,并且分离了每个子线程。分离线程的目的是让子线程在后台运行,不再和主线程有关联。注意,如果不分离线程,那么主线程在退出时会等待所有子线程执行完毕,这可能会导致程序的死锁。
相关问题
写一段C++代码,定义一个函数,该函数需要反复被调用N次,其中主线程耗时比子线程短,要求主线程跑完立即返回,而子线程执行至结束,下一个循环开始时,新的主线程必须等待上一个子线程跑完再开始
以下是代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void* child_thread(void* arg) {
int* num = (int*)arg;
printf("Child thread: %d\n", *num);
sleep(1); // 模拟子线程执行耗时操作
free(num);
pthread_exit(NULL);
}
void main_thread(int n) {
printf("Main thread: %d\n", n);
}
int main() {
int N = 5;
pthread_t tid;
for (int i = 0; i < N; i++) {
int* num = (int*)malloc(sizeof(int));
*num = i;
if (pthread_create(&tid, NULL, child_thread, num) != 0) {
perror("pthread_create error");
exit(1);
}
main_thread(i);
if (pthread_join(tid, NULL) != 0) {
perror("pthread_join error");
exit(1);
}
}
return 0;
}
```
在上面的代码中,我们使用了 pthread 库来创建子线程。在主线程中,我们先打印出当前循环的计数器 i,然后创建一个子线程,将 i 作为参数传递给子线程。接着,主线程立即返回,开始下一轮循环。在子线程中,我们先打印出当前的参数值,然后模拟子线程执行耗时操作,最后释放参数内存并退出线程。在主线程中,我们使用 pthread_join 函数来等待子线程执行完毕,然后开始下一轮循环。这样,我们就实现了主线程和子线程的交替执行,且主线程不会等待子线程执行完毕。
c++ wxwidgets 主线程负责界面更新和事件循环,子线程负责执行计算或其他耗时操作。在子线程中,可以通过wxThread::TestDestroy()定期检查是否需要停止执行。如果需要暂停,可以在主线程中通过某种机制(如事件或者全局变量)通知子线程停止执行。 完整代码
wxWidgets 是一个开源的跨平台 C++ GUI 库,允许开发者创建图形用户界面应用程序。在使用 wxWidgets 开发多线程程序时,主线程通常用于界面更新和处理事件循环,而子线程则负责执行后台任务,如复杂的计算或者其他耗时的操作。
在子线程中,`wxThread::TestDestroy()` 函数可以用来检查线程是否应该停止。如果主线程决定要停止子线程,它可以通过发送事件或者使用全局变量来通知子线程。使用全局变量时,子线程需要周期性地检查这个变量,以确定是否接收到停止的指令。
下面是一个简化的例子,展示了如何使用 wxWidgets 实现主线程和子线程之间的基本协作。请注意,这个例子仅用于说明目的,并不是一个完整的程序。
```cpp
#include <wx/wx.h>
#include <wx/thread.h>
#include <atomic>
class WorkerThread : public wxThread {
public:
WorkerThread() : wxThread(wxTHREAD_JOINABLE) {}
virtual ExitCode Entry() override {
// 子线程运行的代码
while (!TestDestroy()) {
// 执行计算或耗时操作
// 为了避免占用过多CPU资源,可以适当暂停线程
wxThread::Sleep(100);
}
return 0;
}
void Stop() {
// 告诉子线程停止运行
RequestInterruption();
}
};
class MyApp : public wxApp {
public:
virtual bool OnInit() override {
m_workerThread = new WorkerThread();
if (m_workerThread->Create() == wxTHREAD_NO_ERROR &&
m_workerThread->Run() == wxTHREAD_NO_ERROR) {
// 子线程启动成功
} else {
// 子线程启动失败的处理
delete m_workerThread;
m_workerThread = nullptr;
return false;
}
return true;
}
virtual int OnExit() override {
if (m_workerThread != nullptr) {
m_workerThread->Stop();
m_workerThread->Wait();
delete m_workerThread;
m_workerThread = nullptr;
}
return wxApp::OnExit();
}
private:
WorkerThread* m_workerThread;
};
class MyFrame : public wxFrame {
public:
MyFrame(const wxString& title) : wxFrame(nullptr, wxID_ANY, title) {
// 界面和事件绑定代码
}
void OnExit(wxCommandEvent& event) {
// 主线程中处理退出事件
GetParent()->Close(true);
}
};
wxIMPLEMENT_APP(MyApp);
```
阅读全文