【发布时间】:2019-07-29 13:56:56
【问题描述】:
我创建了几个线程并行执行以下线程函数,线程函数的输入参数是一个整数。 不同的线程得到不同的整数。在 thread 函数中,我定义了一个局部变量 thread_index 来接受这个将在计算中使用的整数。我的问题是这些局部变量会与其他线程的变量混淆,我认为这不应该发生。事实上,每个线程函数中都有一个循环,第一次尝试循环对所有线程都可以,但之后,局部变量“thread_index”就搞砸了。我使用信号量屏障来保护计算过程,但这不应该是我当前的问题。 所有未声明的变量都是在主函数中预定义的。我不明白为什么局部变量会被其他人打断。
以下是线程创建过程,其中N为整数,控制线程数,pthread_t t[N/2]。 for(long thread_index = 0;thread_index
void *exchange_swap(void *ptharg){
// cout<<"num_phases "<<num_phases<<endl;
long thread_index = (long) ptharg;
for (phase = 1; phase <= num_phases;)
{
int num_groups = pow(2, (phase-1) % num_stages);
// cout<<num_groups<<endl;
int group_size = N / num_groups;
int gindex = (thread_index) / (group_size / 2);
int mindex = (thread_index) % (group_size / 2);
int group_start = gindex * group_size;
int group_end = (gindex + 1) * group_size - 1;
int data1 = group_start + mindex;
int data2 = group_end - mindex;
// swap
int temp;
if (sortArray[data1]>sortArray[data2])
{
temp = sortArray[data1];
sortArray[data1] = sortArray[data2];
sortArray[data2] = temp;
}
sem_wait(&s);
cout<<"Thread "<<thread_index+1<<" finished stage "<<(phase - 1) / num_stages + 1<<" phase "<<(phase-1) % num_stages + 1<<endl;
finished_job++;
if (finished_job == N/2){
finished_job = 0;
phase++;
for (int i = 0; i < N; ++i)
{
cout<<sortArray[i]<<" ";
}
cout<<endl;
sem_post(&barrier);
}
sem_post(&s);
sem_wait(&barrier);
sem_post(&barrier);
}
return NULL;
}
【问题讨论】:
-
您确定您的意思是
long thread_index = (long) ptharg;而不是long thread_index = *(long*) ptharg;? -
如何创建线程?你能创建一个minimal reproducible example 给我们看吗?还有你为什么不用
std::thread(我猜这里,不过好像你没用)。 -
是的,我使用 long thread_index = (long) ptharg,我尝试了您的建议,但出现了分段错误(核心转储)。我还怀疑我在内部传递了一个指针,因此在一段时间后,变量对所有人都保持不变。但我不知道问题到底出在哪里。
-
for(long thread_index = 0;thread_index
-
@phonetagger 不幸的是,OP 在评论中添加了线程创建(而不是编辑问题,因此使代码难以阅读)但 OP 正在传递 value。使用 C 线程函数时,通常将值转换为指针,而在线程函数内部则相反。
标签: c++ multithreading semaphore