【问题标题】:Binding multiple pthreads, each to the same member function of a different object from the same class绑定多个 pthread,每个 pthread 与来自同一类的不同对象的相同成员函数
【发布时间】:2015-05-15 09:00:14
【问题描述】:

我已将多个 pthread 绑定到来自同一类的独立对象的独立成员函数。

我不得不使用静态成员函数作为助手,因为在 C++ 中无法将成员函数直接绑定到 pthread;但是,我的应用程序行为异常,我对使用此静态函数持怀疑态度,因为此静态函数在同一类的所有对象之间共享。

这种用法对吗?有没有替代方案?

我很高兴听到任何指导。

class Region
{
public:

    Region();

    void Init();

    void Push_Tuple(int int_value, float float_value, bool tuple_source);

    static void *Read_Tuple_R_Process_S_Update_helper(void *context)
    {
        return ((Region *)context)->Read_Tuple_R_Process_S_Update();
    }
    void* Read_Tuple_R_Process_S_Update();

    static void *Read_Tuple_S_Process_R_Update_helper(void *context)
    {
        return ((Region *)context)->Read_Tuple_S_Process_R_Update();
    }   
    void* Read_Tuple_S_Process_R_Update();
};

int main(){

    Region regions[THREAD_COUNT*2]; 

    for(int i=0; i < THREAD_COUNT*2; i++){
        regions[i].Init();
    }

    pthread_t thread_ID[THREAD_COUNT*2];
    void* exit_status;

    for(int i=0; i < THREAD_COUNT; i++){
        pthread_create(&thread_ID[i], NULL, &Region::Read_Tuple_R_Process_S_Update_helper, &regions[i]);
    }

    for(int i=THREAD_COUNT; i < THREAD_COUNT*2; i++){
        pthread_create(&thread_ID[i], NULL, &Region::Read_Tuple_S_Process_R_Update_helper, &regions[i]);
    }   

    for(int i=0; i < THREAD_COUNT*2; i++){
        pthread_join(thread_ID[i], &exit_status);
    }

return 0;
}

【问题讨论】:

  • 您是否研究过 Boost 或 C++11 线程?两者都简化了线程创建和绑定到类方法。

标签: pthreads member-functions


【解决方案1】:

虽然我怀疑我描述的绑定,但这不是我的问题的根源,它可以正常工作。 问题是等待受优化器影响的循环!使用 volatile 关键字解决了我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多