Неверное преобразование типов в потоках c, void * в int - PullRequest
0 голосов
/ 25 марта 2020

Прежде всего, я надеюсь, что вы все в безопасности. Я пытаюсь передать массив, который содержит идентификаторы потоков, созданных в C. Я знаю, что программа полна ошибок, но я получаю одну ошибку, которую не знаю, как ее устранить. В строке, где я пишу threadID [i] = (int *) tid [i]; Я получаю недопустимое преобразование типов. Что я пытаюсь сделать в конвертации void * в int, и я получаю эту ошибку. Я довольно плохо на C, но я пытаюсь учиться. Если бы я мог получить какую-либо помощь, я был бы признателен

Спасибо

#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>

int x=0;


void* printMsg(void *tid)
{
    pthread_t id = pthread_self();
    int nthreads;
    //Get the number of threads
    nthreads= sizeof(tid);

    //Copy thread array from main to threadID array
    int *threadID[nthreads];
;
    for(int i=0;i<nthreads;i++)
        threadID[i]=(int*)tid[i];

    if(pthread_equal(id,threadID[x]))
    {
        printf("%d\n",x);
        x++;
    }
    while(1);
}

int main()
{
    int i=0;
    int n=0;

    printf("Enter number of threads : ");
    scanf("%d",&n);

    pthread_t tid[n];

    for(i=0;i<n;i++)
    {
        pthread_create(&(tid[i]), NULL, &printMsg, (void*)tid);
    }

    for (i=0;i<n;i++) 
    { 
        pthread_join(tid[i], NULL); 
    } 

    sleep(5);

    return 0;
}

1 Ответ

0 голосов
/ 25 марта 2020

Идеальный способ сделать это - сообщить потоку, какой он находится во время создания. Вы можете сделать это, передав идентификатор потока в качестве аргумента. Вот способ, которым вы можете сделать это:

void *printMsg(void *tnum_p) {
    int tnum = *(int *)tnum_p;
    printf("%d\n", tnum);
    return NULL;
}

int main() {
    int i = 0;
    int n = 0;

    printf("Enter number of threads: ");
    scanf("%d", &n);

    pthread_t tid[n];
    int tnum[n];

    for(i = 0; i < n; i++) {
        tnum[i] = i;
        pthread_create(&(tid[i]), NULL, &printMsg, &(tnum[i]));
    }

    for (i = 0; i < n; i++) {
        pthread_join(tid[i], NULL);
    }

    return 0;
}

Можно подумать, что мы могли бы просто передать &i вместо &(tnum[i]); это скомпилирует безо всякой ошибки, но тогда каждый поток получит один и тот же адрес, и это будет зависеть от удачи и времени, что каждый поток найдет там (то есть почти наверняка у вас будут повторяющиеся числа).

(Я также предпочитаю tid + i и tnum + i вместо &(tid[i]) и &(tnum[i]), но это только я.)

Если вам нужно отправить любую другую информацию, тогда сделайте struct для переноса все, что вам нужно, вместо передачи int.

...