6

私はマルチスレッド プログラムに取り組んでおり、mutex を定義する場所について質問があります。

関連情報: プログラムにはmain.c、ユーザー入力に従って特定のアクションを決定する場所があります。main は、という名前のファイルにある master_function を呼び出しますmaster.c。このmaster.cファイルでは、他のいくつかのアクション (関係ありません) に沿って N 個のスレッドを作成します。スレッドは、ファイルにある son_threads という名前の関数を呼び出し、son.c重要な領域に入るときにミューテックスを使用する必要があります (競合状態を防ぐためにいくつかのグローバル変数を編集します)。私が持っている別のファイルは、type.h使用する必要があるいくつかのグローバル変数を定義する場所です。

ミューテックスの宣言は次のとおりです。

  pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;

そのため、ファイルtype.hに表示されるように、自分でミューテックスを定義しようとしました。son.cコンパイルしようとすると、エラーが発生します。そのミューテックスをいくつかのファイルで定義しているので、これは正しいです。

son.cしかし、そのスレッドを作成するたびにミューテックスがデフォルト設定に初期化され、適切に使用できなくなるため、ファイルでミューテックスを定義できないと確信しています。これについてはわかりません。

ミューテックスは、N 個のスレッドがアクセスできるグローバル変数でなければなりません。じゃあどこに置けばいいの?

私は自分自身を正しく説明しているかどうかわかりません。がんばります。

4

3 に答える 3

8

ファイルで変数を宣言するだけです.h

extern pthread_mutex_t mutex1;

Cファイルの初期化で定義を保持します。これは、C 標準が意味するとおりです。

POSIX では、静的ストレージを使用したミューテックスの初期化が非常に重要です。そのため、その定義は.hファイルに存在できません。

于 2012-06-15T19:28:30.037 に答える
2

しかし、son.cファイルでミューテックスを定義することはできないと確信しています。そのスレッドを作成するたびに、ミューテックスがデフォルト設定に初期化され、正しく使用できなくなるためです。これについてはよくわかりません。

これは正しくありません。ミューテックス定義をそのファイルに入れますが、スレッド関数の外に置きます。プログラムの起動時に初期化されますが、新しいスレッドごとには初期化されません。ヘッダーファイルの1つを挿入して、ミューテックスのユーザーがミューテックスについて知らextern pthread_mutex_t mutex1;ないようにすることができます。son.c

于 2012-06-15T19:24:16.297 に答える
1

グローバル変数が必要で、それを 'C' のモジュール間で共有する必要がある場合は、インクルード ファイルで宣言するのが一般的だと思います。昔は、.h ファイルで "GLOBAL" のような魔法のマクロを "extern" として使用し、メインでは GLOBAL を何も定義せずにメインで宣言していました。

#ifndef _TYPES_H
#define _TYPES_H

    // types.h

    #ifndef GLOBAL
    #   define GLOBAL extern
    #endif

    GLOBAL my_global mutex;


#endif
于 2012-06-15T19:04:22.643 に答える