将对象传递给另一个线程后无法访问某些成员变量

Can't access certain member variables after passing object to another thread

本文关键字:访问 变量 成员 对象 线程 另一个      更新时间:2023-10-16

我有一个多线程应用程序,其中对象 A 具有链表 B 的实例。将 A 传递给另一个线程后,我无法访问 B。

定义 A:

struct Peer 
{
   public:
   ...
   Linked_List *message_list;
   ...
   Peer() {
      ...
      message_list = new Linked_List;
      ...
   };
 ...
};

定义 B:

class Linked_List {
public:
...
Linked_List();
int                 add(string);
string              get();
string              get_nb();
void                clear(bool);
private:
struct Node*        head;
HANDLE              ghSemaphoreLinkedList;
HANDLE              ghSemaphoreGet;
};
struct Node {
string data;
Node* next;
};

主线程:

Peer *client = new Peer;
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) &SendToPeer, &client, 0, &thread);

访问线程:

DWORD WINAPI SendToPeer(Peer *client)
{
while(1)
{
            //While debugging, VSC++ says it can't read the memory of  client->message_list
    string msg = client->message_list->get();
    }
}

可能是什么问题?

问候大卫

client 变量传递给 CreateThread()lpParameter参数时,您需要删除 & 运算符:

//CreateThread(..., &client, ...);
CreateThread(..., client, ...);

SendToPeer()期望接收Peer*指针,但实际上您正在向其发送Peer**指针。

我认为您可能只需要将指针值传递给函数,并且可能您应该尊重void*,因为CreateThread的第四个参数是LPVOID,它是void*。我没有测试它,希望它会起作用

DWORD WINAPI SendToPeer(LPVOID param)
{
    Peer * client = (Peer*) param;
    while(1)
    {
            //While debugging, VSC++ says it can't read the memory of  client->message_list
           string msg = client->message_list->get();
    }
    return 0;
}

Peer *client = new Peer;
CreateThread(NULL, 0, &SendToPeer, client, 0, &thread);