通过C11 _Atomic布尔标志启动/停止线程处理

tkclm6bt  于 2023-03-17  发布在  其他
关注(0)|答案(1)|浏览(153)

下面的代码通过_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;
}
lndjwyie

lndjwyie1#

显示的代码应该 * 工作 *,但它实现了一个“自旋循环”,浪费电力,并可能导致 * 整个系统 * 的性能不佳。
如果不了解代码的更多细节,我很难给予更具体的建议,但您 * 可能 * 正在寻找这些API中的一个或多个,它们允许您阻塞线程,直到发生以下几个不同事件之一:

相关问题