在多个线程中递减索引
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
}
}
为了使用多线程处理数组中的数据,我想使用索引访问数组的每个元素。每个线程递减索引并使用其当前值来处理数组中的相应数据。索引是一个原子整数,递减到 -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
}
}