为了使用多线程处理数组中的数据,我想使用索引访问数组的每个元素。每个线程递减索引并使用其当前值来处理数组中的相应数据。索引是一个原子整数并递减,直到它为-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。我怎么能这样做?
答案 0 :(得分:2)
使用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
}
}