Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ “的同步机制”;“数据准备就绪”;旗帜_C++_Multithreading_Boost_Locking - Fatal编程技术网

C++ “的同步机制”;“数据准备就绪”;旗帜

C++ “的同步机制”;“数据准备就绪”;旗帜,c++,multithreading,boost,locking,C++,Multithreading,Boost,Locking,考虑以下C++中的伪代码: // somewhere in common code, properly scoped boost::mutex data_ready_lock; bool data_ready; // Thread 1: void SomeThreadFunc() { // ... push data onto a shared data structure that is properly locked data_ready_lock.lock(); data_r

考虑以下C++中的伪代码:

// somewhere in common code, properly scoped
boost::mutex data_ready_lock;
bool data_ready;

// Thread 1:
void SomeThreadFunc() {
  // ... push data onto a shared data structure that is properly locked
  data_ready_lock.lock();
  data_ready = true;
  data_ready_lock.unlock();
}

// Thread 2:  (actually a function called from the main() thread)
// Returns the number of bytes written to output_data
size_t RequestData(uint8_t* const output_data) {
  data_ready_lock.lock();
  if (data_ready) {
    // reset the flag, so I don't read out the same data twice
    data_ready = false;
    data_ready_lock.unlock();
    // copy over data, etc.
    return kDataSize;
  } else {
    data_ready_lock.unlock();
    return 0;
  }
}
有没有更好的方法来实现这一点?我考虑的是条件变量,但我需要能够重置标志,以确保对RequestData()的背对背调用不会产生相同的数据


像往常一样,提前感谢您的帮助。

我不知道您的最终目标是什么,但是使用实际的线程安全队列可能会简化您的代码。这里有一个:


如果标志是您唯一关心的问题,那么您可以尝试使用
atomic

// somewhere in common code, properly scoped
boost::atomic< bool > data_ready(false); // can be std::atomic and std::memory_order_* below

// Thread 1:
void SomeThreadFunc() {
  // ... push data onto a shared data structure that is properly locked
  data_ready.store(true, boost::memory_order_release);
}

// Thread 2:  (actually a function called from the main() thread)
// Returns the number of bytes written to output_data
size_t RequestData(uint8_t* const output_data) {
  if (data_ready.exchange(false, boost::memory_order_acquire)) {
    // copy over data, etc.
    return kDataSize;
  } else {
    return 0;
  }
}
//在公共代码中的某个地方,范围正确
boost::原子数据准备就绪(false);//可以是下面的std::原子和std::内存顺序
//线程1:
void SomeThreadFunc(){
//…将数据推送到正确锁定的共享数据结构上
data\u ready.store(true,boost::memory\u order\u release);
}
//线程2:(实际上是从main()线程调用的函数)
//返回写入输出数据的字节数
大小请求数据(uint8*const输出数据){
if(数据\u ready.exchange(false,boost::memory\u order\u acquire)){
//复制数据等。
返回kDataSize;
}否则{
返回0;
}
}

但是,在实际代码中,“推送数据”和“复制数据”代码片段之间会存在竞争,除非它们单独同步。

既然您使用的是boost,为什么不使用呢?数据本身不是FIFO,我需要访问队列的能力。例如,调用方有两个请求数据调用。一个会给你整个数据集,另一个只会给你最近推送的数据(即后进先出)。你说的更好是什么意思?您想要RequestData的事件驱动调用计划?只是想知道是否有更简单和/或更有效的方法来实现我的目标,即在推送任何数据之前,让对RequestData的调用不读取重复数据或返回垃圾。我是否理解正确,第二个表单只能返回最后一个数据,也就是说,你真的不能一直用它蹦蹦跳跳吗?如果我是正确的,我相信,您可能会拆分结构,并拥有队列和单个数据源。我不想做我想做的事情。这个问题应该提供更多的上下文:您链接到的问题只描述了您想要使用的程序和数据结构。它没有说你的最终目标是什么,或者你的努力会解决什么问题。看。