线程内存问题
Memory issues with threads
我正在开发一个多线程服务器应用程序。我有一个结构,我试图传递给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, ðread);
}
}
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, ðread);
^^
这应该只是p
将params**
传递给mailQueue
线程,然后将其强制转换为params*
并取消引用,这是未定义的行为。在实践中,p->mq
是*p
的地址(因为offsetof(params, mq) == 0
(,它是Server
构造函数中p
的值,正如您在cout
输出中看到的那样。
要修复它,您应该向新线程传递一个params*
,即变量p
而不是它的地址。
相关文章:
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- 包含矢量指针的结构的内存释放问题
- 在函数中分配内存时出现问题
- C++ 结构内部的unordered_map会导致内存泄漏问题吗?
- 使用 NTAllocateVirtualMemory 和 GetProcAddress 的内存分配问题不起作用
- 释放内存(主题模板)时出现问题
- C++ 中 std::vector 的内存问题
- C++ DLL 堆内存分配问题
- 在我的以下代码中获取 MLE(内存限制错误).尝试解决 ROUND C 2019(问题 A-摆动行走)启动问题
- 字符 * 未从重载运算符或内存管理问题正确返回
- delete[]有问题,如何部分删除内存
- 内存泄漏问题
- 指向动态内存中结构中的变量时出现问题
- c++中的内存管理问题
- C++堆栈内存管理问题
- 为什么我的C 代码在Linux上运行,而在Windows上不运行,是否有RAM内存的问题
- JNA 参数问题:内存访问无效
- boost的问题::内存映射~500MB,外部USB文件