Linux中的线程函数中的局部变量?

时间:2012-09-23 14:37:57

标签: c++ linux multithreading

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的地址是相同的?

任何答案都表示赞赏~~~

感谢~~~

2 个答案:

答案 0 :(得分:2)

对象'节点n'是堆栈本地的,所以两个线程中的每一个都有自己的节点'。这就解释了为什么每次只看到一个' a'其中两个人。

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

如果您希望两个线程都在同一节点上工作,那么

你需要使它成为一个全局变量,或者分配一个并将指针作为第四个参数传递给pthread_create(),以便将它传递给test_thread()。

答案 1 :(得分:0)

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

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

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