struct node
{
public:
char *s;
int up;
node()
{
up = 0;
s = new char[1000];
memset (s, 0, sizeof(char) * 1000);
}
~node()
{
delete [] s;
}
void insert()
{
s[up++] = 'a';
}
};
void* test_thread(void *arg)
{
pthread_mutex_lock( &mutex1 );
node n;
n.insert();
printf ("%s\n", n.s);
printf ("%x\n", &n);
pthread_mutex_unlock( &mutex1 );
pthread_exit(0);
//return 0;
}
supose这个函数将由
执行pthread_create(&id1, NULL, test_thread, NULL);
pthread_create(&id2, NULL, test_thread, NULL);
并由
编译g++ test_thread.cpp -o main -lpthread -g
结果是
a
40a001a0
a
40a001a0
在我的Linux运算符中,两个线程中节点n的地址是相同的!
我想知道为什么tho线程包含的节点n的地址是相同的?
任何答案都表示赞赏~~~
感谢~~~
答案 0 :(得分:2)
对象'节点n'是堆栈本地的,所以两个线程中的每一个都有自己的节点'。这就解释了为什么每次只看到一个' a'其中两个人。
当第二个线程启动时,第一个线程可能已经完成,包括释放内存,以便第二个线程再次获得相同的内存块,这解释了相同的地址。
如果您希望两个线程都在同一节点上工作,那么
你需要使它成为一个全局变量,或者分配一个并将指针作为第四个参数传递给pthread_create(),以便将它传递给test_thread()。
答案 1 :(得分:0)
退出帖子前添加sleep(1)
。现在您应该看到两个不同的地址,但'a'
的输出相同。 (你需要pthread_join
)。
现在,如果要打印'aa'
,则可能需要在全局空间中定义节点或在main中定义节点。
使用当前代码lock
/ unlock
没有任何用处,但是一旦使用共享内存,第二个线程在第一个线程完成之前就无法写入。