当我们进行多线程进行编程的时候呢,确实可以让我们的程序变得更加高效,但是,在面临多线程时,我们必须要做好线程之间的同步。比如说,有一个线程在读内存,另一个线程在写入内存,这将发生不可描述的事件,这就好比一个人在另一个人读书的时候修改书中的文字一样。因此,线程同步就变得相当重要了。好在呢,windows提供了很多的方式可以让线程同步变得容易。下面来介绍下在应用层下的几种线程同步方式。
第一种是自旋锁,Interlocked系列的原子访问操作,什么是原子操作呢?就是不可再分的,不能打断的。也就是说在同一时刻只能有一个在访问同一资源,不能同时进行访问。下面来看一个叫做InterlockedExchange这个API,它是用来将两个数进行交换的一个原子访问操作,其声明如下:
LONG InterlockedExchange(
LPLONG Target, // 要交换的变量值
LONG Value // 交换后的新值
);
该函数会返回原来的值,因此,在实现自旋锁的时候呢,该函数就变得非常有用,以下是第一种方式测试代码:
#include <windows.h>
#include <list>
//全局变量,关键数据
std::list<int> test = { 1, 2, 3, 4, 5 };
unsigned int locker = FALSE;
DWORD WINAPI Thread1(LPVOID lpParameter)
{
while (1)
{
//将locker的值与TRUE进行交换,返回原来的值
while (InterlockedExchange(&locker, TRUE) == TRUE) // #1
Sleep(0);
if (test.size())
{
printf("%d\n", lpParameter);
test.pop_front(); // #3
}
//再一次进行交