0

私はマルチスレッド サーバー アプリケーションに取り組んでいます。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...
4

1 に答える 1

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

これはただのはずですp

params**aをスレッドに渡し、mailQueueそれをキャストしてparams*逆参照します。これは未定義の動作です。実際に起こることは、出力に見られるように、コンストラクターの値である(because )p->mqのアドレスです。*poffsetof(params, mq) == 0pServercout

params*これを修正するには、アドレスではなく変数を新しいスレッドに渡す必要がありpます。

于 2013-05-12T23:27:42.393 に答える