2 つのスレッドを使用する必要があります。1 つは行列に対してさまざまな操作を実行するためのもので、もう 1 つは行列操作プロセスのさまざまな時点で仮想メモリを監視するためのものです。このメソッドは、グローバル状態変数「フラグ」を使用するために必要です。
これまでのところ、次のものがあります(簡潔にするために一部を省略しています):
int flag = 0;
int allocate_matrices(int dimension)
{
while (flag == 0) {} //busy wait while main prints memory state
int *matrix = (int *) malloc(sizeof(int)*dimension*dimension);
int *matrix2 = (int *) malloc(sizeof(int)*dimension*dimension);
flag = 0;
while (flag == 0) {} //busy wait while main prints memory state
// more similar actions...
}
int memory_stats()
{
while (flag == 0)
{ system("top"); flag = 1; }
}
int main()
{ //threads are created and joined for these two functions }
ご想像のとおり、system("top")
呼び出しが 1 回行われ、行列が割り当てられた後、プログラムは無限ループに陥ります。memory_stats
これは、関数に割り当てられたスレッドがすでにその役割を果たしているためであるため、フラグが再び更新されることはないように思えます。
これを回避するエレガントな方法はありますか?メモリ統計を 4 回出力する必要があることはわかっているので、memory_stats
関数内に 4 つの while ループを記述し、それぞれの間にグローバル フラグを条件としてビジー待機を行うことができると思いますが、それは私には扱いにくいように思えます。ヘルプやポインタをいただければ幸いです。