gpt4 book ai didi

c++ - 线程的内存问题

转载 作者:行者123 更新时间:2023-11-28 03:17:06 29 4
gpt4 key购买 nike

我正在开发一个多线程服务器应用程序。我有这个结构,我试图传递给 2 个线程:

struct params{
SafeQueue<int> *mq;
Database *db;
};
class Server{
Server(Database *db){
DWORD sthread, ethread;
params *p;
p = new params;
p->db = db;
SafeQueue<int> *msgq = new SafeQueue<int>;
p->mq = msgq;
cout << "Address of params: " << p << endl;
cout << "Address of SafeQueue: " << msgq << endl;
cout << "Starting Server...\n";
CreateThread(NULL, 0, smtpReceiver, &p, 0, &sthread);
CreateThread(NULL, 0, mQueue, &p, 0, &ethread);
}
}
DWORD WINAPI mailQueue(LPVOID lpParam){
params *p = (params *) lpParam;
SafeQueue<int> *msgQ = p->mq;
cout << "Address of params: " << p << endl;
cout << "Address of SafeQueue: " << msgQ << endl;
cout << "Queue thread started...\n";
}

现在我遇到的问题是 mailQueue 线程中指向 SafeQueue 的指针具有 params 结构的地址...参见输出:

Address of params: 0x23878
Address of SafeQueue: 0x212c8
Starting Server...
Address of params: 0x28fe60
Address of SafeQueue: 0x23878
Queue thread started...

最佳答案

CreateThread(NULL, 0, mQueue, &p, 0, &ethread);
^^

这应该只是 p

您将 params** 传递给 mailQueue 线程,然后将其转换为 params* 并取消引用它,这是未定义的行为。实际上发生的是 p->mq*p 的地址(因为 offsetof(params, mq) == 0)是 Server 构造函数中 p 的值,正如您在 cout 输出中看到的那样。

要修复它,您应该将 params* 传递给新线程,即变量 p 而不是它的地址。

关于c++ - 线程的内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16512987/

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