: reentrant / re-entrant: reentrancy / re-entrancy

 (ISR) ISR使OS使ISRISR

1

[1]

次の例の swap() 関数は、リエントラントではない(同時にスレッドセーフでもない)。したがってこれを割り込みサービスルーチン isr() で使用すべきでない。

int t;

void swap(int *x, int *y)
{
  t = *x;
  *x = *y;
  // ここでハード割り込みが起きて isr() が呼び出される可能性がある。
  *y = t;
}

void isr()
{
  int x = 1, y = 2;
  swap(&x, &y);
}

swap()  tswap()  isr() 

swapint1[2][3]
int t;

void swap(int *x, int *y)
{
  int s;

  s = t; // グローバル変数をセーブ
  t = *x;
  *x = *y;
  // ここでハード割り込みが起きて isr() が呼び出される可能性がある。
  *y = t;
  t = s; // グローバル変数をリストア
}

void isr()
{
  int x = 1, y = 2;
  swap(&x, &y);
}

次のswap関数はリエントラントかつスレッドセーフである。

void swap(int *x, int *y)
{
  int t;
  t = *x;
  *x = *y;
  // ここでハード割り込みが起きて isr() が呼び出される可能性がある。
  *y = t;
}

void isr()
{
  int x = 1, y = 2;
  swap(&x, &y);
}

背景

編集

1使

寿



1OS

リエントラント性の原則

編集



使使使



OSBitBlt





//

リエントラントな割り込みハンドラ

編集

[4][5]

さらなる例

編集

以下のコードにある関数 fg もリエントラントではない

int g_var = 1;

int f()
{
  g_var = g_var + 2;
  return g_var;
}

int g()
{
  return f() + 2;
}

f  g_var 2 fg_var f  f g

:
int f(int i)
{
  return i + 2;
}

int g(int i)
{
  return f(i) + 2;
}

 g_var 使

Pthreads使CfunctionPthreads[6]
void function(pthread_mutex_t mutex)
{
  pthread_mutex_lock(mutex);
  /* ... */
  /* 何らかの処理 */
  /* ... */
  pthread_mutex_unlock(mutex);
}

 function pthread_mutex_init()PTHREAD_MUTEX_NORMAL使2

PTHREAD_MUTEX_RECURSIVE使[7]PTHREAD_MUTEX_RECURSIVEpthread_mutex_lock()pthread_mutex_unlock()PTHREAD_MUTEX_INITIALIZER使PTHREAD_MUTEX_DEFAULT使

Microsoft WindowsEnterCriticalSection()[8]

POSIXのリエントラントと非同期シグナル安全

編集

POSIX"_r" CC[9]

In POSIX.1c, a "reentrant function" is defined as a "function whose effect, when called by two or more threads, is guaranteed to be as if the threads each executed the function one after another in an undefined order, even if the actual execution is interleaved" (ISO/IEC 9945:1-1996, §2.2.2).

2



POSIX118[10][11]

脚注

編集

参考文献

編集
  • Kerrisk, Michael (2010). The Linux Programming Interface. No Starch Press 

関連項目

編集

外部リンク

編集