简介本文介绍C++关键字volatile使用实例,感兴趣的朋友可以参考一下。
被volatile修饰的变量被修改时,会将修改后的变量直接写入主存中,并且将其他线程中该变量的缓存置为无效,从而让其它线程对该变量的引用直接从主存中获取数据,这样就保证了变量的可见性。
但是volatile修饰的变量在自增时由于该操作分为读写两个步骤,所以当一个线程的读操作被阻塞时,另一个线程同时也进行了自增操作,此时由于第一个线程的写操作没有进行所以主存中仍旧是之前的原数据,所以当两个线程自增完成后,该变量可能只加了1。因而volatile是无法保证对变量的任何操作都是原子性的。
示例代码:
#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++实战项目:C++实现雪花算法(SnowFlake)产生唯一ID,主要涉及雪花算法、算法知识等,具有一定的C++实战价值,感兴趣的朋友可以参考一下。
本文介绍一个C++代码片段:如何在C++中删除一个文件目录下的所有文件及目录,感兴趣的朋友可以参考一下。
本文介绍C++实现C++实现8种排序算法,主要包括冒泡排序、插入排序、二分插入排序、希尔排序、直接选择排序、堆排序、归并排序、快速排序,直接上代码,感兴趣的朋友可以参考一下。
本文介绍C++实现线程同步的四种方式:事件对象、互斥对象、临界区、信号量,感兴趣的朋友可以参考一下。
本文介绍C++内存泄漏的检测与定位方法,感兴趣的朋友可以参考一下。
本文向大家介绍一个C++实战项目:C++实现一个多线程安全的队列容器模板类,主要涉及C++模板类的使用、互斥体实现多线程安全、队列数据结构等知识,具有一定的C++实战价值,感兴趣的朋友可以参考一下。