我正在研究一个多线程服务器应用程序。 我有这个结构,我试图传递给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...
答案 0 :(得分:2)
CreateThread(NULL, 0, mQueue, &p, 0, ðread);
^^
这应该只是p
您将params**
传递给mailQueue
线程,然后将其转换为params*
并取消引用它,这是未定义的行为。在实践中发生的事情是p->mq
是*p
处的地址(因为offsetof(params, mq) == 0
),这是p
构造函数中Server
的值,就像你'在cout
输出中重新看到。
要修复它,您应该将params*
传递给新线程,即变量p
而不是其地址。