0

フォーク機能を実装しようとしています。この関数は、1 つのスレッドを 2 つに分割します。最初のものは実行を継続し、2番目のものは(引数で)実行f(calle関数)を開始しvます。私のフォーク関数のコードは

void t_fork(ThreadFunc f, any_ptr v, char *name)
{
     tcb *currentTcb =  malloc(sizeof(tcb));
     currentTcb->func= f;
     currentTcb->arg= v;
     currentTcb->sig=NULL;
     strcpy(currentTcb->name,name);
     setjmp(currentTcb->context);  
     q_insert(theadSystem.waitQ,currentTcb);
     (*f)(v);
}

また、spawn ルーチンを使用して、新しいスレッドにスタック スペースを割り当てる必要があります。

ここで私のコードでsetjmpエラーが発生し、スポナーを使用して新しいスレッドにスペースを割り当てる方法もわかりません。

それは例外を引き起こします:
Unhandled exception at 0xcccccccc in Threads.exe: 0xC0000005: Access violation.

誰でもこれらの問題を修正するのを助けることができますか?

4

1 に答える 1

0

Unhandled exception at 0xcccccccc in Threads.exe: 0xC0000005: Access violation.Windowsで実行されていると表示されていますが、環境を確認できますか? これを呼び出すとfork、UNIX の人々は混乱することに注意してください。

メモリアクセス違反は、どこかにダフポインターがあることを意味しますが、提供する情報が限られているため、どこにあるかを知ることは不可能です。コード内のどこにもスレッドを作成しているようには見えませんが、スレッドが何であるかはわかりません*f。またはどこで呼び出しますCreateThread_beginthreadex(Windows ネイティブ スレッドを使用していると仮定します)。

スレッド、setjmp/longjmp について言及し、spawn(Windows 上で) 新しいプロセスを作成する について質問します。複数のスレッドまたは複数のプロセスを使用していますか?

setjmp と longjmp を使用して、あるプロセスから別のプロセスへのコンテキスト スイッチを実行するにはどうすればよいですか? setjmp/longjmp は、プロセス間ではなく、プロセス内でジャンプする方法であり、ちなみに、メモリ リークを作成する優れた方法です。ペストのような setjmp/longjmp は避けます。

編集:これが私の最善の推測です。あなたの tcb ブロックの名前は次のとおりです。

char * name

strcpyそして、メモリを割り当てずにポインターを初期化せずに、それにa を実行しているだけです。strcpy(currentTcb->name,name);おそらくスタックポインタを上書きしているため、setjmp失敗します。

于 2012-10-22T16:40:07.243 に答える