在用C中断驱动环境中共享主线程和从属线程之间的数据(Sharing data between mas

2019-10-18 07:56发布

我有以下几点:

f1()
{
    while(1)
    {
        call f(2) if hardware interrupt pin goes high
    }
}

f2()
{
    if( th() not started )
    {
        start thread th()
    }
    else
    {
        return thread th() status
    }
}

th()
{
    time-consuming operation
}

目前,我使用以下方法来发起F2一个结构():

static struct SharedData shared;
if( shared == NULL)
{
    initialize shared
}

然后我一个指针传递给共享给线程。 然后线程会定期更新共享 。 然后F2()就会知道,如果日()是基于共享的元素开始,它会通过读取共享检查日的状态()。

假设共享的元素之一是互斥来提供线程安全。 这是一个很好的解决方案? 是否有这样做的更优雅的方式? 我已经测试的代码和它的作品。 我只是在这里需要一些专家的意见。

谢谢,

Answer 1:

假设f2()使用相同的互斥在shared结构中读取数据,该线程之前锁定th用途来修改数据,我看不出任何问题。

如果你有一个以上的线程调用f2()您可能需要使用读写锁的线程状态读写th 。 互斥锁仍可使用序列化线程创建检查。 你也可以使用一个pthread_rwlock_wrlock()连载th创作,但代码可以说是不太清楚。

使用互斥连载th在创作f2()

pthread_rwlock_rdlock(&shared.rwlock);
result = shared.th_status;
if (! shared.th_created) {
    pthread_mutex_lock(&shared.mutex);
    if (! shared.th_created) {
        pthread_create(...);
        shrared.th_created = 1;
    }
    pthread_mutex_unlock(&shared_mutex);
}
pthread_rwlock_unlock(&shared.rwlock);
return result;

使用读写锁连载th在创作f2()

pthread_rwlock_rdlock(&shared.rwlock);
result = shared.th_status;
if (! shared.th_created) {
    pthread_rwlock_unlock(&shared.rwlock);
    pthread_rwlock_wrlock(&shared.rwlock);
    if (! shared.th_created) {
        pthread_create(...);
        shrared.th_created = 1;
    }
}
pthread_rwlock_unlock(&shared.rwlock);
return result;


文章来源: Sharing data between master thread and slave thread in interrupt driven environment in C