C++
 Computer >> コンピューター >  >> プログラミング >> C++

C言語のgetchar_unlocked()関数とは?getchar()との違いと使い方を解説

getchar_unlocked()関数とは

C言語のgetchar_unlocked()関数は、標準入力から1文字を読み取るための関数です。基本的な動作はgetchar()とほぼ同じですが、最大の違いはスレッドセーフではないという点にあります。

通常のgetchar()は、読み取り時にストリームのロックを取得して保護するため、マルチスレッド環境でも安全に利用できます。一方、getchar_unlocked()はこのストリームのロックチェックを行いません。そのため、複数のスレッドから同時に呼び出すと動作が保証されず、Windows環境では非推奨(deprecated)とされています。

ただし、ロック処理を省略している分だけオーバーヘッドが小さく、getchar()よりも高速に動作するという利点があります。競技プログラミングのように、大量の入力を単一スレッドで高速に処理したい場面では、意図的に使われることもあります。

getchar()との比較

項目getchar()getchar_unlocked()
スレッドセーフ性あり(ロックを取得)なし(ロック未取得)
処理速度やや遅い速い
Windowsでの扱い推奨非推奨
想定される用途一般的なプログラム全般単一スレッドの高性能処理

構文

int getchar_unlocked(void);

引数は受け取らず、戻り値として読み取った1文字をunsigned char型からint型に変換して返します。ファイル終端(EOF)に達した場合やエラーが発生した場合にはEOFが返されます。

使用例

以下は、getchar_unlocked()を使って標準入力から1文字を読み取るC言語のサンプルプログラムです。

#include <stdio.h>

int main(void) {
    int val;
    printf("Enter the character : \n");
    val = getchar_unlocked();
    printf("Entered character : %c", val);
    return 0;
}

なお、戻り値はEOF判定のためにchar型ではなくint型の変数で受けるのが安全です。

実行結果

Enter the character : a
Entered character : a

まとめ

getchar_unlocked()は、ストリームのロックチェックを省略することで高速化を実現したgetchar()の亜種です。しかし、スレッドセーフではないため、マルチスレッドプログラムでの使用は避けるべきです。一般的なアプリケーション開発では素直にgetchar()を使い、getchar_unlocked()は単一スレッドかつ入力速度が重要になる特殊なケースに限定して活用するとよいでしょう。

  1. HTML5の文字エンコーディング設定方法を徹底解説

    文字エンコーディングとは文字エンコーディング(文字符号化方式)とは、バイト列(コンピュータ上の数値データ)を人間が読める文字に変換するための仕組みです。WebブラウザなどのプログラムがHTML文書を正しく検証・表示するためには、その文書で使われている文字エンコーディングを適切に判別・指定する必要があります。エンコーディングの指定が正しく行われていないと、日本語ページなどではいわゆる「文字化け」が発生し、ユーザー体験を大きく損なってしまいます。HTML5では、文字エンコーディングを設定する方法として以下の3つが用意されています。1. HTTP Content-TypeヘッダーCGIやサーバーサイ

  2. HTML文字セット(charset)とは?文字エンコーディングの指定方法を解説

    HTML文字セット(charset)とは、Webページ上のテキストを正しく表示するために指定する文字エンコーディングのことです。代表的な文字セットには、ASCII、ANSI、ISO-8859-1、UTF-8などがあります。 主な文字セットの種類と特徴 ASCII:128種類の英数字や記号を定義した、最も基本的な文字セットです。 ISO-8859-1(Latin-1):256種類の文字コードをサポートし、西ヨーロッパ系言語の表示に対応しています。 UTF-8:世界中のほぼすべての文字を扱えるUnicodeベースのエンコーディングで、現在のWeb標準として最も広く使われています。 HTMLで文