无锁编程

#include 
#include 

int main(int argc, char **argv)
{
	int i = 10, j = 0;

	//先将i的值返回,再将i+1
	j = __sync_fetch_and_add(&i, 1);
	printf("加:i=%d	j=%d	", i, j);

	//先将i+1,再将加运算i+1的和返回
	i = 10;
	j = 0;
	j = __sync_add_and_fetch(&i, 1);
	printf("i=%d	j=%d\n", i, j);
	
	//先将i返回,再将i-1
	i = 10;
	j = 0;
	j = __sync_fetch_and_sub(&i, 1);
	printf("减:i=%d	j=%d	", i, j);

	//先将i-1,再将i-1的差返回
	i = 10;
	j = 0;
	j = __sync_sub_and_fetch(&i, 1);
	printf("i=%d	j=%d\n", i, j);

	//先将i返回,再将i|10
	i = 10;
	j = 0;
	j = __sync_fetch_and_or(&i, 10);
	printf("或:i=%d	j=%d	", i, j);

	//先将i|10,再将i|10的结果返回
	i = 10;
	j = 0;
	j = __sync_or_and_fetch(&i, 10);
	printf("i=%d	j=%d\n", i, j);

	//先将i返回,再将i&5
	i = 10;
	j = 0;
	j = __sync_fetch_and_and(&i, 5);
	printf("与:i=%d	j=%d	", i, j);

	//先将i&5,再将i&5的结果返回
	i = 10;
	j = 0;
	j = __sync_and_and_fetch(&i, 5);
	printf("i=%d	j=%d\n", i, j);
	
	//先将i返回,再将i^5,异或
	i = 10;
	j = 0;
	j = __sync_fetch_and_xor(&i, 5);
	printf("异或:i=%d	j=%d	", i, j);

	//先将i^5,再将i^5的结果返回
	i = 10;
	j = 0;
	j = __sync_xor_and_fetch(&i, 5);
	printf("i=%d	j=%d\n", i, j);

	//先将i返回,再将先与i&1后非,与非
	i = 0;
	j = 0;
	j = __sync_fetch_and_nand(&i, 0);
	printf("与非:i=0x%x	j=0x%x	", i, j);

	//先将i&i再非,再将结果返回
	i = 0;
	j = 0;
	j = __sync_nand_and_fetch(&i, 1);
	printf("i=0x%x	j=0x%x\n", i, j);
	
	//如果前面两个参数的值相等,就将第三个参数的值赋值给第一个参数,相等则返回true,否则返回false
	i = 12;
	bool flag = false;
	printf("i=%d	", i);
	flag = __sync_bool_compare_and_swap(&i, 1, 123);
	if (true == flag)
	{
		printf("TURE:i=%d\n", i);
	}
	else
	{
		printf("FLASE:i=%d\n", i);
	}
	
	//如果前面两个参数的值相等,就将第三个参数的值赋值给第一个参数,相等则返回true,否则返回false
	i = 12;
	printf("i=%d	", i);
	flag = __sync_bool_compare_and_swap(&i, 12, 123);
	if (true == flag)
	{
		printf("TURE:i=%d\n", i);
	}
	else
	{
		printf("FLASE:i=%d\n", i);
	}


	//如果前面两个参数的值相等,就将第三个参数的值赋值给第一个参数,返回操作之前的值
	i = 12;
	j = 0;
	printf("i=%d	", i);
	j = __sync_val_compare_and_swap(&i, 1, 123);
	if (i == j)
	{
		printf("TURE:i=%d	j=%d\n", i, j);
	}
	else
	{
		printf("FLASE:i=%d	j=%d\n", i, j);
	}
	
	//如果前面两个参数的值相等,就将第三个参数的值赋值给第一个参数,相等则返回true,否则返回false
	i = 12;
	printf("i=%d	", i);
	j = __sync_val_compare_and_swap(&i, 12, 123);
	if (j == i)
	{
		printf("TURE:i=%d	j=%d\n", i, j);
	}
	else
	{
		printf("FLASE:i=%d	j=%d\n", i, j);
	}
	return 0;
}



你可能感兴趣的:(linux,C函数)