Многопоточность - C - Дублирующая статическая переменная - PullRequest
1 голос
/ 14 февраля 2011

Есть ли в любом случае дублировать некоторые статические переменные каждый раз, когда поток делает к ним доступ?

Я публикую простой пример: Модуль testF.c

#define <stdio.h>
#include <windows.h>
#include <process.h>
#include "testF.h"

#define MAX_THREADS 10

int *var;

void  testF( void *arg ){ 
    int a,N,i;

    a = (INT_PTR)arg;
    N = (int)(10000/(int)(a+1));
    var = (int*) malloc(N*sizeof(int));
    for(i = 0; i<N; i++)
        var[i] = (int)a;
    _endthread();
}
...

И в другом модуле main.c,

...
#include "testF.h"

int main(void){
    HANDLE   hth[MAX_THREADS];
    DWORD   dwExitCode;
    int i;
    for(i = 0; i<MAX_THREADS; i++)
         hth[i] = (HANDLE)_beginthread( testF, 0, (void*)i );

    WaitForMultipleObjects(MAX_THREADS, hth, TRUE, INFINITE);

    for(i = 0; i<MAX_THREADS; i++){
        GetExitCodeThread( hth[i], &dwExitCode );
        printf( "thread 1 exited with code %u\n", dwExitCode );
        CloseHandle( hth[i] );
    }
}

В этом примере переменная, которую я хотел бы дублировать, является *var.

Я видел, что такие функции, как rand(), всегда дают одинаковый результат, есливызывается из другого потока, поэтому я думаю, что должен быть способ сделать это.

Ответы [ 2 ]

4 голосов
/ 14 февраля 2011
0 голосов
/ 14 февраля 2011

Такие функции, как rand(), обычно используют локальное хранилище потоков, чтобы поддерживать состояние вызовов для каждого потока.Это то, что вам нужно сделать вместо использования языковой конструкции, такой как static.Другой вариант - передать переменную в функцию запуска потока вместо использования глобальной или статической.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...