×

Loading...
Ad by
  • 最优利率和cashback可以申请特批,好信用好收入offer更好。请点链接扫码加微信咨询,Scotiabank -- Nick Zhang 6478812600。
Ad by
  • 最优利率和cashback可以申请特批,好信用好收入offer更好。请点链接扫码加微信咨询,Scotiabank -- Nick Zhang 6478812600。

请教VC++ 多线程编程问题

在C++ 中
我定义了一个Manger 和 Worker 类
在Manager 中创建多个Worker 对象, Worker对象初始化过程中创建一个线程.
我希望每个Worker 对象线程运行代码是一样的, 既 线程的代码的是Worker 类的一个成员函数,
以下是我在Worker 创建线程的一行代码
m_hPrinterEventThread = CreateThread(NULL, NULL,this->PrinterEventThread, this, NULL, 0);
其中PrinterEventThread 是Workerd的成员函数, 定义为: DWORD WINAPI PrinterEventThread(LPVOID lpVoid);
但编译通不过, 提示下列错误
error C2664: 'CreateThread' : cannot convert parameter 3 from 'DWORD (LPVOID)' to 'LPTHREAD_START_ROUTINE'
除非我把PrinterEventThread 定义为: static DWORD WINAPI PrinterEventThread(LPVOID lpVoid);
编译才能通过. 但如果这样做就意味着几个Worker 线程函数入口地址是一样, 到时会造成某一个线程的数据被另一线程所更改.

在C# 中不存在这样的问题, 所以我想VC++ 也应该有办法做到.
如果哪位知道怎么做请回应.
谢谢
Report

Replies, comments and Discussions:

  • 工作学习 / 专业技术讨论 / 请教VC++ 多线程编程问题
    在C++ 中
    我定义了一个Manger 和 Worker 类
    在Manager 中创建多个Worker 对象, Worker对象初始化过程中创建一个线程.
    我希望每个Worker 对象线程运行代码是一样的, 既 线程的代码的是Worker 类的一个成员函数,
    以下是我在Worker 创建线程的一行代码
    m_hPrinterEventThread = CreateThread(NULL, NULL,this->PrinterEventThread, this, NULL, 0);
    其中PrinterEventThread 是Workerd的成员函数, 定义为: DWORD WINAPI PrinterEventThread(LPVOID lpVoid);
    但编译通不过, 提示下列错误
    error C2664: 'CreateThread' : cannot convert parameter 3 from 'DWORD (LPVOID)' to 'LPTHREAD_START_ROUTINE'
    除非我把PrinterEventThread 定义为: static DWORD WINAPI PrinterEventThread(LPVOID lpVoid);
    编译才能通过. 但如果这样做就意味着几个Worker 线程函数入口地址是一样, 到时会造成某一个线程的数据被另一线程所更改.

    在C# 中不存在这样的问题, 所以我想VC++ 也应该有办法做到.
    如果哪位知道怎么做请回应.
    谢谢
    • VC++忘了,说的不一定适用。你可以用static把生成线程的成员函数定义成全局的,把this指针作为线程环境参数传递进去。线程里面的栈变量是不受影响的,所有数据段变量踢到类里面。
      我先去买菜,回来给你找找我以前的代码,不过不是VC的。
      • See Header, ignoring the template part:
        Header:
        class CGServer : public CGObject
        {
        public:
        template< class T > CGServer* CreateServerinNewThread(
        T* p_sample, const char * st_svrname );

        static bool IsRunning( const char * str_svr_name );
        static void * ThreadFunc( void * para ); /* only called when server
        * is created in a new thread
        */
        protected:
        static pthread_key_t key_ServerInstance;
        static void DestroyServerInstanceKey(void * stupid_para );

        template< class T > inline CGServer*
        CGServer::CreateServerinNewThread( T* p_sample, const char * st_svrname )
        {
        .............................................
        CGServer* p_thisserver = dynamic_cast<CGServer*> (new T(str_svrname ));
        pthread_create (&p_thisserver->theThreadId, NULL, ThreadFunc,
        reinterpret_cast <void *>(p_thisserver ) );

        return p_thisserver;
        }
      • See Source:
        void * CGServer::ThreadFunc( void * para )
        {
        CG3Server* p_thisserver;
        ...............................................
        *p_thisserver = (CGServer*)para;
        pthread_setspecific( key_ServerInstance, (void *)p_clntmap );
        }
        (*p_thisserver)->Initialize();
        (*p_thisserver)->RunServer();
        (*p_thisserver)->UnInitialize();
        return NULL;
        }
    • 之所以叫Thread就是因为stack是单独的,你在thread里面分配的内存其他thread并不能看到。
    • class 的function的第一个缺省参数是this指针,除非it is static function. So you can either change it to static or create a global function as mentioned by 梦游加拿大. Otherwise the signature of the function would not match.
    • 谢谢以上各位的答复, 问题已经解决了.