Pthread 的奇怪行为
Posted
技术标签:
【中文标题】Pthread 的奇怪行为【英文标题】:Odd behavior of Pthreads 【发布时间】:2013-05-04 17:26:35 【问题描述】:我已经编写了一个使用 pthread 进行某些处理的程序。该程序每次运行时都会产生奇怪的行为。 为简单起见,我已经评论了处理线。错误仍然存在。 那是代码(相关部分):
pthread_t Thread[THREAD_NUM];
pthread_barrier_t BarrierStart;
pthread_rwlock_t DebugLock;
void T2_FFT_Comp(void)
int Return;
T2_FFT_Comp_Input ThreadInput;
Return = pthread_rwlock_init(&DebugLock,NULL);
if (Return)
cout << endl << "Error while creating lock ";
pthread_barrier_init(&BarrierStart,NULL,THREAD_NUM);
for(int i = 0;i < THREAD_NUM;i++)
ThreadInput.Start = i*ThreadDataSize; //struct is relevant to processing part
ThreadInput.ThreadNum = i;
Return = pthread_create(&Thread[i],NULL,T2_FFT_Comp_ThreadFn,(void *)&ThreadInput);
pthread_rwlock_wrlock(&DebugLock);
cout << endl << "creating thread number " << i;
pthread_rwlock_unlock(&DebugLock);
if (Return)
cout << endl << "Error while creating thread #" << i;
for (int i = 0;i<THREAD_NUM;i++)
Return = pthread_join(Thread[i],NULL);
if (Return)
pthread_rwlock_wrlock(&DebugLock);
cout << endl << "Error while joining thread Number : " << i;
pthread_rwlock_unlock(&DebugLock);
pthread_rwlock_destroy(&DebugLock);
return;
void *T2_FFT_Comp_ThreadFn(void *input)
int InputStart = ((T2_FFT_Comp_Input *)input)->Start;
int ThreadID = ((T2_FFT_Comp_Input *)input)->ThreadNum;
int Return;
pthread_rwlock_wrlock(&DebugLock);
cout << endl << "Thread number : " << ThreadID << " created";
pthread_rwlock_unlock(&DebugLock);
pthread_exit(NULL);
程序产生奇怪的行为。有时是分段错误。有时它会产生这样的输出
creating thread number 0
Thread number :0 created
creating thread number 1
creating thread number 2
creating thread number 3
Joining Thread Number : 0
Thread number :3 created
Thread number :3 created
Thread number :3 created
创建的线程数有时是对的,也可能是错的。有时也有多个连接线。 我不明白为什么会这样。
【问题讨论】:
【参考方案1】:同一个局部变量的地址,名为ThreadInput
,被传递给每个线程。这意味着每个线程都在访问、非同步的同一个变量。这是一个竞争条件,是未定义的行为。即使它不是竞争条件,它也不是预期的行为。要更正,请将不同的实例传递给每个线程而不是相同的实例(通过使用 T2_FFT_Comp_Input[THREAD_NUM]
的数组并将元素的地址仅传递给一个线程或通过动态分配 T2_FFT_Comp_Input
并将其传递给线程并具有线程free()
它)。
【讨论】:
以上是关于Pthread 的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章