c++ - 如何让两个线程通过指针交换数据?

标签 c++ multithreading function pointers atomic

我想要一个异步线程来编辑一个对象。因此,我存储了一个指向该对象的指针。

Data *pointer;

还有一个 std::atomic<bool> 类型的标志知道辅助线程是否正在修改指针指向的对象。当标志为真时,主线程不会影响指针及其底层对象。

std::atomic<bool> modifying;

void Thread()
{
    // wait for jobs
    for(;;)
    {
        // the flag is set to true my the main thread
        // to let this thread start processing
        if(modifying)
        {
            // modify the object the pointer points to,
            // pass the pointer to a function to do so,
            // and so on...

            // the flag to false to tell the main thread
            // that it can read the result from the pointer
            // and prepare it for the next job
            modifying = false;
        }
    }
}
  • 如何确保线程安全?

我不能用 std::atomic 包装指针因为从辅助线程我需要将指针传递给期望非原子 Data* 的函数输入参数。

  • 指针甚至需要特别声明为原子的吗?我不认为处理器会在写入单个寄存器期间更改线程。或者我是否必须将其设为原子性以防止不需要的编译器优化?
  • 如果指针是原子的,那么底层对象也是吗?换句话说,我可以使用从 pointer.load() 获得的指针修改对象吗? ?

感谢您的澄清。

最佳答案

听起来您想要的是拥有编辑对象的特权互斥。这正是互斥锁的用途。

通常,假设您有线程 A 和 B,它们都想更新同一个指针。例如,当 A 想要进行编辑时,它会尝试 lock() 互斥体。如果互斥体尚未被 B 锁定,这将成功,并且 A 可以做它的事情。如果互斥锁 已经被 B 锁定,那么 A 将阻塞(即停止执行)直到 B 释放对互斥锁的锁,此时 A 将继续并照常做事。

有关 C++11 互斥锁语法的更具体示例,此页面做得很好: http://en.cppreference.com/w/cpp/thread/mutex

当然,我会推荐 pthreads 库来解释互斥量(和其他线程概念): https://computing.llnl.gov/tutorials/pthreads/#Mutexes

在您的情况下,您的代码可能如下所示:

std::mutex editing;

void Thread()
{
    for(;;)
    {
        editing.lock();

        // Do whatever editing you wanted to do here.

        editing.unlock();
    }
}

还值得注意的是 std::mutex 类上的 try_lock() 函数。这与 lock() 非常相似,除了如果互斥锁已经被锁定,那么它只会返回 false 以指示无法获取锁,然后继续。如果您希望您的线程忘记编辑对象并在另一个线程已经在编辑对象时继续,而不是等待另一个线程然后再编辑,这将很有用。

关于c++ - 如何让两个线程通过指针交换数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16613700/

相关文章:

c++ - 序列容器的迭代器类型是什么?

python - 元胞自动机算法似乎不起作用

ios - NSMutableArray 线程并发与 GCD

c++ - mmap 和 mutex 的使用

javascript - 我不知何故无法停止我的 setTimeout() 循环

PHP - 通过引用函数参数传递

c++ - 文件映射 IPC 在 MapViewOfFile 调用时挂起

C++标准题

c++ - 传递给函数的数组差异

c++ - 为什么我的结构只在最后一个而不是每个上存储字符串?