スレッド ライブラリを作成しようとしています。MyThreadCreate
タイプのオブジェクトを返しますMyThread
。例えば:
struct MyThread
{
ucontext_t Context;
ThreadStatus Status;
int ThreadId;
};
typedef struct MyThread MyThread;
void * MyThreadCreate(void(*start_funct)(void *), void *args)
{
MyThread temp;
char *stack;
stack = (char *)malloc(8192*sizeof(char));
ucontext_t tempContext;
if (getcontext(&tempContext) == -1)
temp->ThreadId = 0;
tempContext.uc_stack.ss_sp = stack;
tempContext.uc_stack.ss_size = 8192*sizeof(char);
tempContext.uc_link = NULL;
makecontext(&tempContext,(void(*)(void))start_funct,1, args);
temp->Context = tempContext;
temp->Status = READY;
temp->ParentThread = currentThread;
temp->ThreadId = NEW_THREAD_ID++;
return temp;
}
私のclient.c
では、次のように呼び出します。
MyThread T;
T = (MyThread)MyThreadCreate(t0, (void *)n2);
MyThreadJoin(T);
MyThreadJoin で、T の threadId の値を確認すると、ランダムな値が取得されます。
void MyThreadJoin(MyThread thread); //defintion for MyThreadJoin
更新部分: MyThread という名前のオブジェクトを返そうとすると、MyThreadCreate を呼び出した直後にセグメンテーション違反が発生します。また、次の定義を含むヘッダー ファイル (変更できません) を含めていることに注意してください。typedef void *MyThread したがって、コードは、MyThreadCreate に対して void * を返す場合にのみ機能し、MyThread の場合には機能しません。しかし、コードは正常に動作しますが、この場合、threadId を取得できません。どこが間違っているのか誰か教えてください。
MyTHreadCreate の戻り値を MyThread として保持しようとすると、セグメンテーション違反がスローされます。だから私はそれを void * にし、オブジェクトを取得してからそれを使用して MyThreadJoin を呼び出すことができますが、そこで MyThreadId のジャンク値を取得します。私が見逃しているのは何ですか。