いくつかの計算などを行い、いくつかのスレッドを起動するために pthreads を使用するプログラムがあります。これはうまくいきます。
ただし、ベンチマーク タイプのものについては、同じスレッドのセットを数回起動する必要があります。それらを 2 回目に起動すると、segfault (コア ダンプ) が発生します。
選択したコード:
Pastebin の代替 (最初のミューテックス行がありません) 問題に関連するものを含める必要があります: http://pastebin.com/5iUsy8L2
function()
{
pthread_mutex_t pmutex;
for (int k = 0; k < 10; k++)
{
pthread_mutex_lock (&pmutex);
pthread_t pthreads[CPUTHRDS];
launch_threads(pthreads);
/* Unlock and start timer */
pthread_mutex_unlock (&pmutex);
tot_time = -msecond();
/* Join taskthreads when they are done */
join_threads(pthreads);
tot_time += msecond();
//<do something>
}
}
void launch_threads(pthread_t *pthreads)
{
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
printf("#HOST# Starting Task Threads\n");
/* Launch the CPU threads */
for (int i = 0; i < CPUTHRDS; i++)
{
fprintf(stderr, "launchthread %d\n", i);
int rc = pthread_create(&pthreads[i], &attr, cpu_thread, NULL);
if (rc) {
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
}
printf("#HOST# CPU-Threads started: %d\n", CPUTHRDS);
pthread_attr_destroy(&attr);
}
void join_threads(pthread_t *pthreads)
{
int rc = 0;
for(int i=0; i < CPUTHRDS; i++)
{
void *status;
rc = pthread_join(pthreads[i], &status);
if (rc) {
printf("ERROR; return code from pthread_join() is %d\n", rc);
exit(-1);
}
printf("#HOST# Thread %d joined\n", i);
}
printf("#HOST# All threads joined\n");
}
void *cpu_thread(void *arg)
{
unsigned long thid = pthread_self();
fprintf(stderr, "started %lu\n", thid);
}
出力
#HOST# Starting Task Threads
launchthread 0
launchthread 1
#HOST# CPU-Threads started: 2
started 46969086678784
started 46969084577536
#HOST# Thread 0 joined
#HOST# Thread 1 joined
#HOST# All threads joined
#HOST# Starting Task Threads
launchthread 0
Segmentation fault (core dumped)
既存の変数への依存関係を削除しようとしましたが、2 回目に失敗します。
ご回答ありがとうございます。