0

スレッドに独立したアドレス空間を持たせる方法はありますか? ローカル変数を使用して多くのスレッドでループを実行したいのですが、それらはすべて同じ変数を共有しているようです。

例えば

for (i = args->start; i < args->end; i++) {
        printf("%d\n", i);
        if (quickFind(getReverse(array[i]), 0, size - 1)) {
            printf("%s\n", array[i]);
            //strcpy(array[i], "");
        }
    }

iスレッド間で共有されているようです。

4

4 に答える 4

0

スレッドは、親プロセスのメモリ空間を共有します。その特徴です。これが発生したくない場合は、 fork() を使用して、独自のアドレス空間を持つ新しいプロセスを作成できます。

fork() を使用する場合は、子プロセスの作成に成功すると、子プロセスに 0 が返され、子プロセスの PID が親プロセスに返されることに注意してください。

于 2013-10-04T03:27:05.317 に答える
0

各スレッドが関数を個別に呼び出すだけです。関数の呼び出しごとに、すべてのローカル変数の独自のインスタンスが取得されます。これが正しくない場合、再帰は機能しません。

于 2013-10-04T23:56:20.727 に答える
0

本当に怠惰になりたい場合、および設計変更をまったく行わない場合 (あまりお勧めしません)、 の宣言を のiように変更し__thread int iて、すべてのスレッドがその変数の独自のインスタンスを持つようにすることができます。

Posix スレッドの代わりに OpenMP を使用していた場合は#pragma omp threadprivate(i)i.

于 2013-10-05T00:07:04.490 に答える
0

Short answer: Yes it's possible for each thread to have its own copy of the variable i.

Long answer:

All threads share the same address space and the OS does not provide any protection to prevent one thread from accessing memory used by another. However, the memory can be partitioned so that it will only be accessed by a single thread rather than being shared by all threads.

By default each thread receives its own stack. So if you allocate a variable on the stack then it will typically only be accessed by a single thread. Note that it is possible to pass a pointer to a stack variable from one thread to another, but this is not recommended and could be the source of the sort of problems that you are seeing.

Another way for a thread to receive its own copy of a variable is using thread local storage. This allows each thread to have its own copy of a global variable.

In summary, although threads share an address space they can work on private data. But you need to be careful with how you are sharing data between threads and avoid data races.

于 2013-10-04T21:43:30.533 に答える