以便携式方式执行此操作实际上是不可能的。
但是,您可以使用各种编译器内部函数来实现它。
例如,对于 x86(-64) 上的 gcc,可能至少 ARM:
static int queued_work;
static void inc_queued_work()
{
(void)__sync_add_and_fetch( &queued_work, 1 );
}
/*
Decrement queued_work if > 0.
Returns 1 if queued_work was non-equal to 0 before
this function was called.
*/
static int dec_queued_work()
{
/* Read current value and subtract 1.
If the result is equal to -1, add 1 back and return 0.
*/
if( __sync_sub_and_fetch( &queued_work, 1 ) == -1 )
{
__sync_fetch_and_add( &queued_work, 1 );
return 0;
}
return 1;
}
一些 CPU:s 只支持 compare_and_swap。您也可以使用该 intrisic 来实现它:
/* Alternative solution using compare_and_swap */
void inc_queued_work()
{
do {
int queued = queued_work;
/* Try to write queued-1 to the variable. */
if( __sync_bool_compare_and_swap( &queued_work,
queued, queued+1 ) )
return;
} while( 1 );
}
int dec_queued_work()
{
do {
int queued = queued_work;
if( !queued ) return 0;
/* Try to write queued-1 to the variable. */
if( __sync_bool_compare_and_swap( &queued_work,
queued, queued-1 ) )
return queued;
} while( 1 );
}
即使您有多个作者和读者,这些功能也应该可以工作。和朋友一起应用google到'sync_add_and_fetch'会给你很多参考文档