クライアント(GUIとソケットを使用する)で作業しています。私のプロトコルのフライコマンドでは(メインスレッド上で実行されている)GUIが作成されます。新しいコマンドを作成するたびに、動的スタックに追加します。スレッド間のスタックの同期
(pthreadを使用して)別のスレッドでは、スタックにコマンドがあるかどうかを確認してから、ソケット(非ブロックbtw)を使ってプログレッシブに送信します。スタックの一番上にあるコマンドが送信されると、スタックをポップします(つまり、コマンドが削除され、最初の要素の下にある各コマンドがプッシュアップされます)。
私はそれを同期するのに大きな問題があると思います...私はいくつかのフラグ、ミューテックスを使用しようとしますが、私はいつもメモリ上でいくつかのアクセス違反で終わります。
基本的に何イムがやってはこれです:メインスレッドで
とき(IE)のユーザー押しボタン:別のスレッドで
char cmd[ 50 ] = "My new protocol command";
AppendCommandToSendStack(cmd);
:
if(SendStackCount)
{
SendCommand(0); // 0 = The top of the stack.
if(IsCommandDoneSending(0))
{
RemoveCommandFromStack(0);
}
}
誰も助けることができます私はこのメカニズムを動作させる方法を教えてくれます。あるいは、実装しようとしているImと同じまたは同様のワークフローをもたらすもう1つのアプローチ。
事前にTks!
[更新]
私はセマフォ上で読み始めると、私が必要なものを正確にthatsのだ...しかし、Imは擬似コードでやって何が...動作しているようですしません:
sem_t mutex;
int stack_count;
command *stack;
main()
{
// Init & Connect client.
// Start Thread
sem_init(&lock_stack, 0, 1);
while(1)
{
sem_wait(&lock_stack);
++stack_count;
stack = (command *) realloc(stack, stack_count * sizeof(command));
strcpy(stack[ stack_count - 1 ].cmd, "new command");
sem_post(&lock_stack);
}
}
thread()
{
while(1)
{
sem_wait(&lock_stack);
if(stack_count)
{
// Send stack[ 0 ].cmd via socket then when done pop the stack like this:
--stack_count;
if(0 < stack_count)
{
memcpy(&stack[ 0 ],
&stack[ 1 ],
(stack_count - 1) * sizeof(command));
}
}
sem_post(&lock_stack);
}
}
これは基本的に新しいので、私はスタック配列上でランダムに発生するように見えるメモリアクセス違反があるため、何か明白なものがありません。
ご質問いくつかの答えを受け入れることによって、あなたの受け入れの評価を向上させてください。また、 "*私はいくつかのフラグ、mutexを使用しようとしますが、私は常にメモリ上のアクセス違反で終わります。*"は非常に曖昧です。多分あなたはそれのためのいくつかのコードを提供することができますか? – Constantinius
スタックエントリをカウントし、エントリがないときにプロデューサを待機させるセマフォだけでなく、mutexまたはCriticalSectionを使用して複数のアクセスからスタックを保護する必要があります。また、最初にスタックにゼロのアイテムがあるときに、セマフォカウントを1に初期化するのはなぜですか?ああ - そして、動的に割り当てられたオブジェクト/構造体へのポインタを積み重ねるだけで、そのrealloc/memcpyのものを取り除こうとします。スタックへの/からのrealloc/memcpyは、キューがmutexによってロックされている間に行われなければならない - 競合が悪い。 –