gpt4 book ai didi

c++ - pthread - 使用线程访问多个对象

转载 作者:行者123 更新时间:2023-11-28 00:41:04 25 4
gpt4 key购买 nike

我正在尝试使用多线程,但目前还没有成功。我正在创建一个允许与设备进行串行通信的程序,并且它在没有多线程的情况下工作得很好。现在我想介绍线程,一个线程不断发送数据包,一个线程接收和处理数据包,另一个线程用于GUI。

前两个线程总共需要访问四个类,但是使用pthread_create()我只能传递一个参数。然后我无意中发现了一篇关于堆栈溢出 (pthread function from a class) 的帖子,其中 Jeremy Friesner 提出了一种非常优雅的方式。然后我发现创建一个 Core 类最简单,它包含我的线程需要访问的所有对象以及线程的所有函数。所以这是我的 Core 类的示例:

/** CORE.CPP **/

#include "SerialConnection.h" // Clas for creating a serial connection using termios
#include "PacketGenerator.h" // Allows to create packets to be transfered
#include <pthread.h>

#define NUM_THREADS 4

class Core{
private:
SerialConnection serial; // One of the objects my threads need access to
pthread_t threads[NUM_THREADS];
pthread_t = _thread;

public:
Core();
~Core();
void launch_threads(); // Supposed to launch all threads
static void *thread_send(void *arg); // See the linked post above
void thread_send_function(); // See the linked post above
};

Core::Core(){
// Open serial connection
serial.open_connection();
}

Core::~Core(){
// Close serial connection
serial.close_connection();
}

void Core::launch_threads(){
pthread_create(&threads[0], NULL, thread_send, this);

cout << "CORE: Killing threads" << endl;
pthread_exit(NULL);
}

void *Core::thread_send(void *arg){
cout << "THREAD_SEND launched" << endl;
((Core *)arg)->thread_send_function();
return NULL;
}

void Core::thread_send_function(){
generator.create_hello_packet();
generator.send_packet(serial);
pthread_exit(NULL);
}

现在的问题是我的串行对象因段错误而崩溃(Core::thread_send(void *arg) 中发生的指针内容让我怀疑。即使它没有崩溃,也没有数据即使程序执行没有任何错误,也会通过串行连接传输。执行形式主要:

/** MAIN.CPP (extract) VARIANT 1 **/
int main(){
Core core;
core.launch_threads(); // No data is transferred
}

但是,如果我直接调用 thread_send_function(线程应该执行的函数),数据将通过串行连接完美传输:

/** MAIN.CPP (extract) VARIANT 1 **/
int main(){
Core core;
core.thread_send_function(); // Data transfer works
}

现在我想知道处理这种情况的正确方法是什么。而不是 Core.cpp 中的那种诡计,我是否应该只创建一个结构来保存指向我需要的不同类的指针,然后将该结构传递给 pthread_create() 函数?一般来说,这个问题的最佳解决方案是什么?

最佳答案

您遇到的问题是您的主线程在创建另一个线程时退出,此时 Core 对象被销毁,然后程序完全退出。当您新创建的线程尝试使用 Core 对象并发送数据时,就会发生这种情况;您要么完全看不到任何事情发生(如果程序在线程开始执行任何操作之前就退出)或崩溃(如果 Core 在线程尝试使用它时被销毁)。理论上您也可以看到它正常工作,但因为线程可能需要一些时间来创建数据包并发送它,所以这不太可能。

您需要在退出前使用pthread_join 阻塞主线程,直到线程完成并退出。

无论如何,您应该使用 C++11 的线程支持或至少使用 Boost。这将使您摆脱指针带来的低级困惑。

关于c++ - pthread - 使用线程访问多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18899505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com