Interlocked 互锁函数 (windows.h)

本文深入探讨了Windows操作系统中用于多线程同步的Interlocked系列函数,重点介绍了它们在处理并发时如何确保数据一致性。通过学习,读者将理解互锁函数在交换操作中的应用及其重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 增减:
  (1) LONG InterlockedIncrement(IN OUT LONG volatile *lpAddend);
  lpAddend为长整型变量的地址,返回值为原始值。这个函数的主要作用是原子性自增(相当于++操作)。
  (2) LONG InterlockedDecrement(IN OUT LONG volatile *lpAddend);
  lpAddend为长整型变量的地址,返回值为原始值。这个函数的主要作用是原子性自减(相当于--操作)。
  (3) LONG InterlockedExchangeAdd ( LPLONG Addend, LONG Increment );
  Addend为长整型变量的地址,Increment为想要在Addend指向的长整型变量上增加的数值(可以是负数)。这个函数的主要作用是保证这个加操作为一个原子访问。

2. 交换:

  (4) LONG InterlockedExchange( LPLONG Target, LONG Value );
  用第二个参数的值取代第一个参数指向的值。函数返回值为原始值。
  (5) PVOID InterlockedExchangePointer( PVOID *Target, PVOID Value );
  用第二个参数的值取代第一个参数指向的值。函数返回值为原始值。
 
3. 比较交换:
  (6) LONG InterlockedCompareExchange(
  LPLONG Destination, LONG Exchange, LONG Comperand );
  如果第三个参数与第一个参数指向的值相同,那么用第二个参数取代第一个参数指向的值。函数返回值为原始值。
  (7) PVOID InterlockedCompareExchangePointer (
  PVOID *Destination, PVOID Exchange, PVOID Comperand );
  如果第三个参数与第一个参数指向的值相同,那么用第二个参数取代第一个参数指向的值。函数返回值为原始值。
 
 
实例程序
#include <windows.h>
#include <process.h>
#include <stdio.h>

#define THREAD_MAX 3

int g_x = 0;

unsigned __stdcall ThreadEntity(void * pVoid)
{
  InterlockedExchangeAdd(reinterpret_cast<long*>(&g_x),1);
  return 1;
}

int main()
{

  HANDLE hth[THREAD_MAX];
  unsigned uiThreadID[THREAD_MAX];

  printf("start create children threadings...\n");
  for(int i = 0; i < THREAD_MAX; ++i)
  {
      hth[i] = (HANDLE)_beginthreadex( NULL, // security
      0, // stack size
      ThreadEntity,
      (void*)&i, // arg list
      0,
      &uiThreadID[i] );

      if ( hth[i]== 0 )
      printf("Failed to create thread %d\n", i);
  }

  WaitForMultipleObjects(THREAD_MAX, hth, true, 10000);

  for(int i = 0; i<THREAD_MAX; ++i)
  {
      CloseHandle( hth[i] );
  }

  printf("last: g_x is %d\n", g_x);
  printf("Primary thread terminating.\n");
}

/*
Output:

start create children threadings...
last: g_x is 3
Primary thread terminating.
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值