在多个线程中递减索引

Decrementing an index in multiple threads

为了使用多线程处理数组中的数据,我想使用索引访问数组的每个元素。每个线程递减索引并使用其当前值来处理数组中的相应数据。索引是一个原子整数,递减到 -1(或 0xFF)。如何防止索引值小于-1?

data_type myData[MAX_DATA_COUNT];
std::atomic<uint16_t> data_index;

void process_array()
{
    uint16_t index = data_index.fetch_sub(1); // problem starts here!
    //
    if(index != -1)
    { 
      do_something_with(myData[index]); // process data at index
    }
    else
    {
        data_index = -1;
    }
}

void worker_thread()
{
   while(is_running){
      wait_for_data();
      process_array();
   }
}

问题是多个线程可以从data_index中减1并使其小于-1。我该怎么做?

使用compare_exchange方法。这是只有在成功检查后才修改变量的标准方法。

void process_array()
{
    uint16_t index = data_index.load();

    while((index != -1) && !data_index.compare_exchange_weak(index, index - 1));

    if(index != -1)
    { 
      do_something_with(myData[index]); // process data at index
    }
}