mutex のロックは、コストが高い、ということでしたが、アトミックを使ったほうが、今回の単純なケースでは、速い、ということが解りました。 また、_Atomicを利用した場合のほうが、ソースコードも簡単になります。 pthread_mutex_lockを使うと pthread_mutex_unlock の呼び出しも必要になり、コードが汚くなってしまいます。 ヘッダファイル サンプルコードの意味 2つのスレッドを同時に実行します。 片方の1つのスレッドは、グローバル変数 shared_data をインクリメントし続けます。 もう1つのスレッドは、グローバル変数 shared_data をデクリメントし続けます。 最終的に 0 になることを期待します。 ロックなしのコードは、アトミックに処理できないので、結果は不定です(0かもしれないし、0以外かもしれない)。 pthread_test1_no
株式会社Ninjastars取締役の齊藤です。 皆様もC言語やC++で開発しているときなどに一度はこの実行時エラーを見たことがあるのではないでしょうか? 今回はSegmentation Fault(以下セグフォ)がどのようにして発生するのかを詳細に書いていこうと思います。 1.セグフォとは 割り当てられた仮想メモリ領域(セグメント)に読み込み(r)または書き込み(w)、実行の権限(x)がない状態でアクセスしたときに起こるエラーのことを指します。 では、なぜセグフォが必要なのでしょうか? それはメモリに展開されているプロセスを保護し、OS全体に影響を及ぼさないためです。 2.セグフォの原因を探す手順 プログラムを用意したのでそれを例に原因を探していきましょう。 まず今回のプログラムは標準入力で10byteのbufferに文字データを格納するものです。 標準入力する際、gets関数を使っている
C言語 Advent Calendar 2016 16日目です。 clang 3.1, gcc 4.9以降にメモリ関連の不正な操作を検出するAddressSanitizerという仕組みが入りました。 二重freeやバッファオーバーフローなどCプログラミングにありがちなメモリ操作を検出できるので、ソフトウェアの品質向上だけでなく、セキュリティ対策としても有用です。 以下に思いつく限りのメモリの不正操作を実際に試してみました。 (1) スタックオーバーフロー(1.1) 正方向の書き込み [stack_overwrite.c] (https://github.com/hamano/santest/blob/master/tests/stack_overwrite.c)(1.2) 正方向の参照 [stack_overread.c] (https://github.com/hamano/santes
はじめに これは何か / 何がいいのか clang-formatは、主にC++を対象としたソースコード整形ツール(code formatter)である。 ソースコード整形ツールは、ソースコードのフォーマット: コーディングスタイルのうちの見た目に関するものを、一定のルールに従って整形するツールである。ソースコード整形ツールを使うことで、例えばインデントの行い方やカッコの付け方などを手間をかけずに統一できる。チームで開発する際などに、全ソースコードのフォーマットをツールに任せて統一できると、フォーマットに対する好みの差によるソースコードの差分が発生しないため開発効率がよい。 C++用ソースコード整形ツールとして、2022年9月現在で名前がよく知られているのはclang-formatぐらいの様子。 clang-formatでは、整形の行い方をルールファイルで指定する。用意されているスタイル(G
C言語のマクロの引数の最後に ... を指定することで任意個の引数を取り、 __VA_ARGS__ で参照できる:
C/C++プログラム実行時の関数をトレースする方法を紹介します。 1.はじめに C/C++プログラムで実行時の関数をトレースする場合、printf()などを埋め込んでログに出力することが少なくないと思います。 が、その方法ではログ出力するためにプログラムに手を入れなくてはならなず、非効率です。 また規模の大きなプログラムでは現実的な解決方法ではありません。 printf()を埋め込まずにトレースできないか、方法を探していたところ、標準でそのような機能があることをみつけました。 仕組みは、gccでトレースしたいプログラムファイルのコンパイル時に、コンパイルオプション"-finstrument-functions"を付与することで、関数の実行開始時および復帰時に下記のフック関数を呼び出せるようになります。 void __cyg_profile_func_enter(void* func, vo
bashなどの shell では "~/*" "$HOME/*" はホームディレクトリ以下のファイル名に展開されます. これをC/C++で実装する方法です 実装 wordexp(3) を使います #include <wordexp.h> #include <stdio.h> int main(int argc, char *argv[]) { wordexp_t exp; int flags = 0; int ret; ret = wordexp("~/*", &exp, flags); if (0 == ret){ int i; for (i=0; i<exp.we_wordc; i++){ printf("%s\n", exp.we_wordv[i]); } } wordfree(&exp); return 0; } なお wordexp は POSIX.1‐2001, POSIX.1
mmap はファイルとメモリーアドレスのマッピングを行う mmap をしてもファイルデータが物理メモリーへ即ロードされない(レイジー最適化) データが物理メモリーにロードされてるかは MMU(メモリー管理ユニット)が検知してページフォルトを生成する OS カーネルがページフォルトをインターセプトしたら、やっとファイルデータはメモリーにロードされる mmap は Linux でファイルとメモリーのアドレスを紐付けて(マップして)、ファイルをメモリーかのようにアクセスできるようにしてくれる関数です。 基本的な用途としてはメモリーの中身をハードディスクの中にあるファイルにバックアップを高い頻度でとりたい場合ですかね。 もしくはディスク内のファイルを配列・バッファーのように読み込みたいとかです。 まあ必ずしもファイルをマップする用途に限定されるわけじゃないですが、ここはお急がしい読者さんのために分
mmapでMAP_FIXEDを利用する方法を紹介します。 1.はじめに mmapはファイルの内容をメモリにマップするC/C++の関数です。 mmapの引数は、 void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); となっています。各引数の意味は次のとおりです。 addr:新しいマッピングの開始アドレス length:マッピングの長さ prot:マッピングのメモリ保護 flags:マッピングに対する更新の見え方 offset:マッピング開始位置 manによるとmmapは次のような動作になります。 addr が NULL の場合、カーネルがマッピングを作成するアドレスを選択する。この方法は最も移植性のある新 しいマッピングの作成方法である。 addr が NULL でない場合、カーネル
コマンドラインオプションの処理を行おうと思うと、 main関数の引数を利用すれば良く、 あとは自分で決めたルールに従いパースすればよい。 ただ、各プログラムごとに必要となる引数やその意味などは異なって当たり前だが、 引数の与え方、引数のフォーマット、という観点では、 ある程度標準的な方法をとった方がプログラマ・ユーザ双方にとってメリットがある。 例えばlsというコマンドで、"."から始まる隠しファイルも含めて表示させるオプションは-a、 パーミッション情報など詳細情報を表示させるオプションは -l である。 両方のオプションを同時に指定する場合は、 ls -a -l や ls -l -a と、どちらを先に指定してもよいし、 ls -la といった形でまとめて指定しても同じ意味になる。 また、コンパイルで利用するgccでは、gcc -o hoge hoge.cといった形で、 -oオプションの
フォーマット指定子一覧 フォーマット指定子とは、C言語のprintf()、fprintf()、sprintf()、scanf()、fscanf()、sscanf()などの関数で使用する、 表示形式を指定するための記述子である。 C言語専用と思っていると、MFC(C++)のCStringクラスやjavaのFormatterクラス(jdk1.5以降)にも使用されていたりして、 やはりしっかり覚えておかなくては、と思わせられることもある(詳細は異なるが)。 度忘れした際にはここを見ればよいように、よく使うフォーマット指定子をここにまとめておく。 なお、ANSI規格での全貌を知りたいときは、fprintfのリファレンス等を参照のこと。 出力フォーマット指定子 printf(),fprintf(),sprintf()などで使用する指定子である。
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く