On Fri, 4 Aug 2000, commedo wrote:
> Bagaimana untuk menciptakan thread sebanyak n buah sekaligus dan setiap
> thread tersebut akan membuat sebuah file dengan nama unik (pake fungsi
> tempnam) dan pake pthread_mutex untuk tempnam tersebut (mencegah
> dihasilkannya nama sama) ?
dari man page-nya tempnam :
never use this function, use mkstemp(3) instead
> Saya sudah membuat sebuah program yang membuat thread sebanyak n buah dengan
> algoritma sbb :
>
> for (j=0; j<nThread; j++)
> {
> i++;
> //printf("Before get el\n");
> el = (*ResultQ)[i];
> printf("[i=%d, j=%d] Retrieving : %s\n", i, j, el.content[0]);
> iRetCode = pthread_create(&aThreadReqId[j], NULL, RequestThread,
> (void*) strdup(el.content[0]));
> if (iRetCode == 0)
> {
> printf("Thread-%d ID = %d created\n", j, aThreadReqId[j]);
> }
> else printf("Error create thread !!!\n");
> }
> for (j=0; j<nThread; j++)
> {
> printf("Joining %d -> Thread ID = %d\n", j, aThreadReqId[j]);
> iRetCode = pthread_join(aThreadReqId[j], &Retval);
> if (iRetCode == 0)
>
>
> printf("Thread-%d ID = %d join\n", j, aThreadReqId[j]);
> }
> else printf("Error joining thread !!!\n");
> }
>
> Fungsi RequestThread tersebut berisi rutin sebagaimana telah saya sebutkan
> sebelumnya. Program tersebut selalu mengalami kegagalan, segmentation fault.
>
> Untuk kasus nThread = 1, tidak ada masalah. Sedangkan untuk nThread > 1,
> maka akan mengalami kegagalan. Kegagalan tersebut adalah ketika thread ke-2
> dibuat, thread ke-1 seolah-olah tidak berfungsi. Setelah thread ke-2 exit,
> kegagalan terjadi. Kemungkinan pada saat eksekusi pthread_join terjadi
> kegagalan dikarenakan thread ke-1 yang tidak tahu kenapa tidak berfungsi
> sebagai mana mestinya.
Mungkin mas commedo bisa melampirkan kode untuk RequestThread di sini ?
Soalnya program dengan mutex rentan terhadap programming error seperti
race condition atau starvation.
> Kira-kira apa penyebabnya ? Sebelumnya saya pakai cara yang sama tetapi
> tidak mengakses file dan baik-baik saja.
Sebaiknya dicari dulu fungsi yang menimbulkan segmentation fault.
Satu cara yang sederhana adalah :
$ gdb <program>
gdb> run
Nanti akan terlihat : Receiveng SIGSEGV at function ... bla bla bla
-dewa-
--------------------------------------------------------------------------------
Utk berhenti langganan, kirim email ke [EMAIL PROTECTED]
Informasi arsip di http://www.linux.or.id/milis.php3
Pengelola dapat dihubungi lewat [EMAIL PROTECTED]