0
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;
}

假设这个函数将由

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 的地址是一样的!

我想知道为什么线程包含的节点n的地址是一样的?

任何答案都非常感谢~~~

谢谢~~~

4

2 回答 2

2

对象“节点 n”是堆栈本地的,因此两个线程中的每一个都有自己的“节点”。这就解释了为什么每次你只看到一个“a”而不是其中的两个。

当第二个线程启动时,第一个线程可能已经完成,包括释放内存,以便第二个线程再次获得相同的内存块,这解释了相同的地址。

如果您希望两个线程都在同一个“节点”上工作,则需要将其设为全局变量,或者分配一个并将指针作为第四个参数传递给 pthread_create(),以便将其传递给 test_thread()。

于 2012-09-23T14:59:08.903 回答
0

sleep(1)在退出线程之前添加。现在您应该看到两个不同的地址,但输出相同'a'。(虽然你需要pthread_join)。

现在,如果要打印,'aa'则可能必须在全局空间中定义节点或在 main 中定义它。

使用您当前的代码,lock/unlock没有任何用处,但是一旦您使用共享内存,第二个线程在第一个线程完成之前无法写入。

于 2012-09-23T16:59:57.240 回答