1

pthread_detachについて読んだところ、呼び出されたときにスレッドによって取得されたリソースが解放されるので、少し実験しましたが、スレッドを切り離した後でも、リソースが解放されていないようです。コードは次のとおりです。

#define SIZE 2048
void *func(void *arg);

int main()
{
    void *x;
    int i;

    pthread_t tid;
    pthread_attr_t attr,attr2;


    int fp=open("SharedMemWithMutex.c",O_RDONLY);


    pthread_attr_init(&attr2);

    pthread_create(&tid,&attr2,func,&fp);

    pthread_join(tid,&x); 

    i=*(int *)x;
    fprintf(stderr,"BEFORE DETACH: read bytes are %d\n",i);
    pthread_detach(tid);

    i=*(int *)x;
    fprintf(stderr,"AFTER DETACH: read bytes are %d\n",i);

    return 0;

}

void *func(void *arg)
{
    int fp=*(int *)arg;

    char buf[SIZE];

    int *readbytes=(int *) malloc(sizeof(int));
    *readbytes=read(fp,buf,SIZE);   

    return readbytes;
}
4

1 に答える 1

2

ここでの「リソース」pthreadsには、スレッドに参加してその終了ステータスを確認するために必要な内部リソースのみが含まれます。

自分で取得したその他のリソース(ヒープメモリ、開いているファイル、データベース接続など)は対象外です。スレッドはリソースを自由に共有できるため、このようなリソースには通常、特定のスレッドに属するという本質的な概念がないことを理解しておくと役立つ場合があります。

コードには他にもいくつか問題があります。

  • スレッドを結合することも、切り離すこともできます。両方を行うことはできません。
  • 関数からの戻りコードを確認することをお勧めします。ここpthread_detach()でおそらくエラーコードが返されます。
  • を繰り返して何を達成したいのかは不明ですi=*(int *)xreadbytes自動的に割り当てが解除されたとしても、2つ目i=*(int *)xは単に未定義の動作を引き起こし、特定の方法で現れた場合と現れなかった場合があります。
于 2013-01-06T09:00:03.423 に答える