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オペレーターでは、2つのスレッドのノードnのアドレスは同じです!

thoスレッドに含まれるノードnのアドレスが同じである理由を知りたいのですが。

どんな答えでも大歓迎です~~~

ありがとう~~~

4

2 に答える 2

2

オブジェクト「ノード n」はスタックローカルであるため、2 つのスレッドのそれぞれに独自の「ノード」があります。これは、'a' が 2 つではなく 1 つしか表示されない理由を説明しています。

2 番目のスレッドが開始するまでに、最初のスレッドはおそらくメモリの解放を含めて既に終了しているため、2 番目のスレッドは同じメモリ ブロックを再度取得し、同じアドレスを説明します。

両方のスレッドを同じ「ノード」で動作させたい場合は、それをグローバル変数にするか、1 つを割り当ててポインタを pthread_create() の 4 番目の引数として渡し、それが test_thread() に渡されるようにする必要があります。

于 2012-09-23T14:59:08.903 に答える
0

sleep(1)スレッドを終了する前に追加してください。これで、2 つの異なるアドレスが表示されるはずですが、出力は同じです'a'。(ただし、必要になりpthread_joinます)。

印刷したい場合'aa'は、ノードをグローバル空間で定義するか、メインで定義する必要があります。

現在のコードではlock/unlockは使用されませんが、共有メモリを使用すると、2 番目のスレッドは 1 番目のスレッドが終了するまで書き込みできません。

于 2012-09-23T16:59:57.240 に答える