线程内存问题

Memory issues with threads

本文关键字:问题 内存 线程      更新时间:2023-10-16

我正在开发一个多线程服务器应用程序。我有一个结构,我试图传递给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而不是它的地址。