简介本文介绍C++关键字volatile使用实例,感兴趣的朋友可以参考一下。

volatile 关键字的作用

  • 1、保证变量写操作的可见性;
  • 2、保证变量前后代码的执行顺序;

volatile的底层原理

被volatile修饰的变量被修改时,会将修改后的变量直接写入主存中,并且将其他线程中该变量的缓存置为无效,从而让其它线程对该变量的引用直接从主存中获取数据,这样就保证了变量的可见性。

但是volatile修饰的变量在自增时由于该操作分为读写两个步骤,所以当一个线程的读操作被阻塞时,另一个线程同时也进行了自增操作,此时由于第一个线程的写操作没有进行所以主存中仍旧是之前的原数据,所以当两个线程自增完成后,该变量可能只加了1。因而volatile是无法保证对变量的任何操作都是原子性的。

volatile的适用场景

  • 1、变量的修改不依赖于变量本身,像是i++、i+=这类的操作在多线程下都是不能保证变量的原子性的。
  • 2、该变量没有包含在具有其他变量的不变式中

示例代码:

#include <windows.h>
#include <stdio.h>

volatile int WorkerID = 10;   // volatile被设计用来修饰被不同线程访问和修改的变量
const int MAXWORKERID = 100;

//Define thread function
DWORD __stdcall ThreadFunOne(LPVOID lParam)
{
	for (;;)
	{
		if (WorkerID<MAXWORKERID)
		{

			WorkerID += 1;
			Sleep(1000);
			printf("ThreadOne print out: %i \n", WorkerID);
		}
	}
	return 0;
}

DWORD __stdcall ThreadFunTwo(LPVOID lParam)
{
	for (;;)
	{
		if (WorkerID<MAXWORKERID)
		{
			WorkerID += 1;
			Sleep(1000);
			printf("ThreadTwo print out: %i \n", WorkerID);
		}
	}
	return 0;
}

int  main()
{
	// Define thread handle
	HANDLE hThread1, hThread2;
	// Create thread
	hThread1 = ::CreateThread(NULL, 0, ThreadFunOne, NULL, 0, NULL);
	hThread2 = ::CreateThread(NULL, 0, ThreadFunTwo, NULL, 0, NULL);
	// Close thread handle
	CloseHandle(hThread1);
	CloseHandle(hThread2);
	// Note: Prevent process exiting
	while (true)
	{
		;
	}
	return 0;
}

输出:

C++volatile关键字,语法基础

更多为你推荐