我有以下内容:
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()的状态。
我们假设共享的一个元素是提供线程安全性的互斥锁。这是一个好的解决方案吗?有更优雅的方式吗?我已经测试了代码并且它有效。我在这里只需要一些专家建议。
谢谢,
答案 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;