线程随机出现 运行.. 只有在线程创建后减慢连接速度后才可靠
Threads appear to run randomly.. Reliable only after slowing down the join after thread creation
我正在使用 pthreads 观察到奇怪的行为。注意下面的代码-
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <pthread.h>
#include <unistd.h>
typedef struct _FOO_{
int ii=0;
std::string x="DEFAULT";
}foo;
void *dump(void *x)
{
foo *X;
X = (foo *)x;
std::cout << X->x << std::endl;
X->ii+=1;
}
int main(int argc, char **argv)
{
foo X[2];
const char *U[2] = {"Hello", "World"};
pthread_t t_id[2];
int t_status[2];
/*initalize data structures*/
for(int ii=0; ii < 2; ii+=1){
X[ii].x=U[ii];
}
foo *p = X;
for(int ii=0; ii < 2; ii+=1){
t_status[ii] = pthread_create(&t_id[ii], NULL, dump, (void *)p);
std::cout << "Thread ID = " << t_id[ii] << " Status = " << t_status[ii] << std::endl;
p+=1;
}
//sleep(1); /*if this is left commented out, one of the threads do not execute*/
for(int ii=0; ii < 2; ii+=1){
std::cout << pthread_join(t_status[ii], NULL) << std::endl;
}
for(int ii=0; ii < 2; ii+=1){
std::cout << X[ii].ii << std::endl;
}
}
当我将 sleep(1)(在线程创建和加入之间)调用注释掉时,我在 2 个线程 运行 中随机只有 1 个线程出现不稳定行为 运行。
rajatkmitra@butterfly:~/mpi/tmp$ ./foo
Thread ID = 139646898239232 Status = 0
Hello
Thread ID = 139646889846528 Status = 0
3
3
1
0
当我取消注释 sleep(1) 时。两个线程都可靠地执行。
rajatkmitra@butterfly:~/mpi/tmp$ ./foo
Thread ID = 140072074356480 Status = 0
Hello
Thread ID = 140072065963776 Status = 0
World
3
3
1
1
pthread_join() 应该阻止程序退出,直到两个线程都完成,但在这个例子中,如果没有 sleep() 函数,我将无法实现。我真的不喜欢 sleep() 的实现。有人可以告诉我是否遗漏了什么吗??
参见 Peter 的注释 -
pthread_join 应该使用线程 ID 调用,而不是 pthread_create 返回的状态值。所以:pthread_join(t_id[ii], NULL),而不是 pthread_join(t_status[ii], NULL)。更好的是,因为问题被标记为 C++,所以使用 std::thread。 –
皮特·贝克尔
我正在使用 pthreads 观察到奇怪的行为。注意下面的代码-
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <pthread.h>
#include <unistd.h>
typedef struct _FOO_{
int ii=0;
std::string x="DEFAULT";
}foo;
void *dump(void *x)
{
foo *X;
X = (foo *)x;
std::cout << X->x << std::endl;
X->ii+=1;
}
int main(int argc, char **argv)
{
foo X[2];
const char *U[2] = {"Hello", "World"};
pthread_t t_id[2];
int t_status[2];
/*initalize data structures*/
for(int ii=0; ii < 2; ii+=1){
X[ii].x=U[ii];
}
foo *p = X;
for(int ii=0; ii < 2; ii+=1){
t_status[ii] = pthread_create(&t_id[ii], NULL, dump, (void *)p);
std::cout << "Thread ID = " << t_id[ii] << " Status = " << t_status[ii] << std::endl;
p+=1;
}
//sleep(1); /*if this is left commented out, one of the threads do not execute*/
for(int ii=0; ii < 2; ii+=1){
std::cout << pthread_join(t_status[ii], NULL) << std::endl;
}
for(int ii=0; ii < 2; ii+=1){
std::cout << X[ii].ii << std::endl;
}
}
当我将 sleep(1)(在线程创建和加入之间)调用注释掉时,我在 2 个线程 运行 中随机只有 1 个线程出现不稳定行为 运行。
rajatkmitra@butterfly:~/mpi/tmp$ ./foo
Thread ID = 139646898239232 Status = 0
Hello
Thread ID = 139646889846528 Status = 0
3
3
1
0
当我取消注释 sleep(1) 时。两个线程都可靠地执行。
rajatkmitra@butterfly:~/mpi/tmp$ ./foo
Thread ID = 140072074356480 Status = 0
Hello
Thread ID = 140072065963776 Status = 0
World
3
3
1
1
pthread_join() 应该阻止程序退出,直到两个线程都完成,但在这个例子中,如果没有 sleep() 函数,我将无法实现。我真的不喜欢 sleep() 的实现。有人可以告诉我是否遗漏了什么吗??
参见 Peter 的注释 -
pthread_join 应该使用线程 ID 调用,而不是 pthread_create 返回的状态值。所以:pthread_join(t_id[ii], NULL),而不是 pthread_join(t_status[ii], NULL)。更好的是,因为问题被标记为 C++,所以使用 std::thread。 – 皮特·贝克尔