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