Как передать определенное значение одному потоку?

Я работаю над упражнением потока в C, это типичный код планирования потоков, который многие школы учат, здесь можно увидеть базовый, мой код в основном такой же, за исключением моего измененного метода runner http: //webhome.csc.uvic .ca / ~ wkui / Курсы / CSC360 / pthreadScheduling.c

То, что я делаю, в основном изменяет часть бегуна, поэтому мой код печатает массив со случайными числами в определенном диапазоне, а не просто печатает несколько слов. мой код бегуна здесь:

void *runner(void *param) {
    int i, j, total;
    int threadarray[100];

    for (i = 0; i < 100; i++)
        threadarray[i] = rand() % ((199 + modifier*100) + 1 - (100 + modifier*100)) + (100 + modifier*100);

    /* prints array and add to total */
    for (j = 0; j < 100; j += 10) {
        printf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d
", threadarray[j], threadarray[j+1], threadarray[j+2], threadarray[j+3], threadarray[j+4], threadarray[j+5], threadarray[j+6], threadarray[j+7], threadarray[j+8], threadarray[j+9]);
        total = total + threadarray[j] + threadarray[j+1] + threadarray[j+2] + threadarray[j+3] + threadarray[j+4] + threadarray[j+5] + threadarray[j+6] + threadarray[j+7] + threadarray[j+8] + threadarray[j+9];
    }
    printf("Thread %d finished running, total is: %d
", pthread_self(), total);
    pthread_exit(0);
}

Мой вопрос заключается в первом цикле, где я назначаю случайные числа для своего массива, я хочу, чтобы этот модификатор изменялся в зависимости от того, какой поток он есть, но я не могу понять, как это сделать, например, если его первый нить диапазон будет 100-199, 2 будет 200-299 и т. д. и так далее. Я попытался присвоить значение i перед выполнением pthread_create и присвоить это значение int в runner для использования в качестве модификатора, но поскольку существует 5 параллельных потоков, он заканчивает присвоение этого числа всем 5 потокам, и они заканчивают тем, что тот же модификатор.

Поэтому я ищу способ приблизиться к этому, когда он будет работать для всех отдельных потоков вместо того, чтобы назначать его всем им, я попытался изменить (void * param, int modifier) ??eters на что-то вроде, pthread_create(&tid[i],&attr,runner,NULL);но когда я сделайте это, я понятия не имею, как ссылаться на runner, поскольку по умолчанию он переопределяется какparam

c,multithreading,pthreads,

-1

Ответов: 1


0 принят

Вы хотите paramуказать на структуру данных или переменную, срок жизни которой будет существовать дольше, чем время жизни потока. И вы передали void*параметр фактическому типу данных, который был назначен как.

Простой пример:

struct thread_data
{
    int thread_index;
    int start;
    int end;
}

struct thread_info;
{
   struct thread_data data;
   pthread_t thread;
}

struct thread_info threads[10];

for (int x = 0; x < 10; x++)
{
    struct thread_data* pData = (struct thread_data*)malloc(sizeof(struct thread_data));  // never pass a stack variable as a thread parameter.  Always allocate it from the heap.

    pData->thread_index = x;
    pData->start = 100 * x + 1;
    pData->end = 100*(x+1) - 1;
    pthread_create(&(threads[x].thread), NULL, runner, pData);
}

Тогда ваш бегун:

void *runner(void *param)
{
    struct thread_data* data = (struct thread_data*)param;
    int modifier = data->thread_index;
    int i, j, total;
    int threadarray[100];

    for (i = 0; i < 100; i++)
    {
        threadarray[i] = ...
    }
с, многопоточный, Pthreads,
Похожие вопросы