下面的代码通过_Atomic布尔标志启动/停止线程内的处理是否安全。在处理线程内不应使用互斥锁,因此不可能使用pthread_cond_wait / pthread_cond_signal。这是一个多核系统。通常如何解决此类问题?
这个想法基本上是使用FUSE实现作为应用程序的接口。FUSE接口可以有一个或多个工作线程。
echo 1 > /fusemountpoint/start
echo 1 > /fusemountpoint/stop
_Atomic bool start;
_Atomic bool stop;
_Atomic bool started;
pthread_mutex_t lock;
//called by some fuse worker thread
static void start(void)
{
pthread_mutex_lock(&lock)
atomic_store_explicit(&start, true, memory_order_relaxed);
while (atomic_load_explicit(&started, memory_order_acquire) == false)
;
atomic_store_explicit(&start, false, memory_order_relaxed);
pthread_mutex_unlock(&lock);
}
//called by some fuse worker thread
static void stop(void)
{
pthread_mutex_lock(&lock);
atomic_store_explicit(&stop, true, memory_order_relaxed);
while (atomic_load_explicit(&started, memory_order_acquire) == true)
;
atomic_store_explicit(&stop, false, memory_order_relaxed);
pthread_mutex_unlock(&lock);
}
//processing thread
static void *process(void *arg)
{
while (run)
{
if (start)
started = 1;
if (stop)
started = 0;
if (started)
// do something
}
return NULL;
}
1条答案
按热度按时间lndjwyie1#
显示的代码应该 * 工作 *,但它实现了一个“自旋循环”,浪费电力,并可能导致 * 整个系统 * 的性能不佳。
如果不了解代码的更多细节,我很难给予更具体的建议,但您 * 可能 * 正在寻找这些API中的一个或多个,它们允许您阻塞线程,直到发生以下几个不同事件之一: