在C中断驱动环境中在主线程和从线程之间共享数据

时间:2013-06-27 18:15:49

标签: c multithreading thread-safety interrupt shared-data

我有以下内容:

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()将根据共享的元素知道是否已启动th(),它将通过读取共享来检查th()的状态。

我们假设共享的一个元素是提供线程安全性的互斥锁。这是一个好的解决方案吗?有更优雅的方式吗?我已经测试了代码并且它有效。我在这里只需要一些专家建议。

谢谢,

1 个答案:

答案 0 :(得分:2)

假设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;