c++类:创建线程的对象+指向函数的指针=访问冲突

C++ Class: Object that creates Thread + pointer to the function = Access violation

本文关键字:函数 指针 访问冲突 对象 创建 线程 c++      更新时间:2023-10-16

我对我得到的奇怪的例外感到非常惊讶。

class Threads { 
    public:
        Threads() {}
        ~Threads() {}
        void StartThread(int (*p)()); //pointer to a function 
    private: 
        HANDLE hThread; 
        DWORD dwThreadID; 
    }; 

方法StartThread应该接收指向我的函数的指针(该函数将在另一个线程中运行)。
这个函数很简单。(正如你所看到的,它位于类线程之外):

int MyThread() 
{
return 0; 
}
这是创建线程的方法:
inline void Threads::StartThread(int (*p)()) 
{
    hThread = CreateThread(NULL, 
            0, 
            (LPTHREAD_START_ROUTINE)(*p)(), 
            NULL,  
            0, 
            &dwThreadID); 
   if (hThread == NULL) 
        {
            return;
        }
}

这里编译器得到错误:不能将参数3从'int'转换为'LPTHREAD_START_ROUTINE'。这就是我选演员的原因。

在主函数中,我创建了线程类型的对象,并尝试调用StartThread方法。作为参数,我发送指针到函数MyThread。

Threads *thread1; 
thread1 = new Threads(); 
thread1->StartThread(MyThread);

我认为MyThread必须在另一个线程中启动。但是函数MyTread总是在主线程中运行!!只有在MyThread结束后,另一个线程开始,然后我得到这个异常:在ThreadClass.exe中0x00000000处未处理的异常:0xC0000005:访问冲突。

我需要聪明的建议!

调用约定错误:

LPTHREAD_START_ROUTINE是一个__stdcall方法,而不是__cdecl方法,参见这里的文档:http://msdn.microsoft.com/en-us/library/aa964928.aspx。

看起来你实际上是在调用这一行的函数…

(LPTHREAD_START_ROUTINE)(*p)()

…它返回一个你正在转换的整型。这是行不通的。如何:

(LPTHREAD_START_ROUTINE)p 

…?