1

我有以下内容:

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

让我们假设shared的元素之一是提供线程安全的互斥锁。这是一个好的解决方案吗?有没有更优雅的方式来做到这一点?我已经测试了代码并且它可以工作。我在这里只需要一些专家建议。

谢谢,

4

1 回答 1

2

假设在读取线程用来修改数据的数据之前f2()在结构中使用相同的互斥锁进行锁定,我没有看到任何问题。sharedth

如果您有多个线程调用f2(),您可能希望使用读写锁来读取和写入 的线程状态th。互斥体仍可用于序列化线程创建检查。您也可以使用 apthread_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;
于 2013-06-27T18:38:50.403 回答