programing

pthread_create 및 마지막 인수로 정수 전달

batch 2023. 6. 20. 21:28
반응형

pthread_create 및 마지막 인수로 정수 전달

다음과 같은 기능이 있습니다.

void *foo(void *i) {
    int a = (int) i;
}

int main() {
    pthread_t thread;
    int i;
    pthread_create(&thread, 0, foo, (void *) i);
}

컴파일 시 주조에 몇 가지 오류가 있습니다((void *) i그리고.int a = (int) i의 마지막 인수로 정수를 전달하려면 어떻게 해야 합니까?pthread_create제대로?

szx의 답변을 바탕으로 (그러므로 그에게 신뢰를 주세요), 여기 그것이 당신에게 어떻게 작용할 것인지가 있습니다.for루프:

void *foo(void *i) {
    int a = *((int *) i);
    free(i);
}

int main() {
    pthread_t thread;
    for ( int i = 0; i < 10; ++1 ) {
        int *arg = malloc(sizeof(*arg));
        if ( arg == NULL ) {
            fprintf(stderr, "Couldn't allocate memory for thread arg.\n");
            exit(EXIT_FAILURE);
        }

        *arg = i;
        pthread_create(&thread, 0, foo, arg);
    }

    /*  Wait for threads, etc  */

    return 0;
}

루프의 각 반복에서, 당신은 각각 다른 주소를 가진 새로운 메모리를 할당합니다. 그래서 전달되는 것은pthread_create()각 반복마다 다르기 때문에 스레드 중 어떤 것도 동일한 메모리에 액세스하려고 하지 않으며 주소를 전달했을 때와 같은 방식으로 스레드 안전 문제가 발생하지 않습니다.i이 경우 배열을 설정하고 요소의 주소를 전달할 수도 있습니다.

할당할 수 있습니다.int과장해서 그것을pthread_create()그런 다음 스레드 기능에서 할당 해제할 수 있습니다.

void *foo(void *i) {
    int a = *((int *) i);
    free(i);
}

int main() {
    pthread_t thread;
    int *i = malloc(sizeof(*i));
    pthread_create(&thread, 0, foo, (void *) i);
}

당신은 주소를 캐스트해야 합니다.i(의 가치보다는)i지금처럼) pthread_create의 마지막 인수에서

pthread_create(&thread, 0, foo, (void *) &i);
                                         ^  is missing

그리고 당신의 기능에도 캐스팅이 잘못되어 있습니다.다음과 같아야 합니다.

int a = *((int*) i);
  1. 값을 읽으려면 초기화해야 합니다.i현재 초기화되지 않았기 때문에 main()에서 어느 정도의 가치가 있습니다.

2 main()에 적절한 정의 사용:

 int main(void) 

또는int main(int argc, char *argv[])또는 그에 상응하는 것.

오래된 질문이지만, 저는 오늘 같은 문제에 직면했고, 저는 이 길을 따르지 않기로 결정했습니다.애플리케이션이 성능에 대한 것이었기 때문에 이러한 스토리지 어레이를 선택했습니다.int정적으로 선언된 s.

나는 당신이 어디에 있는지 많은 애플리케이션을 모르기 때문에.pthread_join/pthread_cancel당신의 것과 다른 범위에 있습니다.pthread_create선택한 방법은 다음과 같습니다.

#define NB_THREADS 4

void *job(void *_i) {
  unsigned int i = *((unsigned int *) _i);
}

int main () {
  unsigned int ints[NB_THREADS];
  pthread_t    threads[NB_THREADS];
  for (unsigned int i = 0; i < NB_THREADS; ++i) {
    ints[i] = i;
    pthread_create(&threads[i], NULL, job, &ints[i]);
  }
}

저는 그것이 더 우아하고, 더 효율적이며, 이 범위에서만 살 수 있기 때문에 해방에 대해 걱정할 필요가 없다고 생각합니다.

이것은 오래된 질문이지만 설명자와 같은 양의 정수를 전달하는 것이 필요할 때 한 가지 옵션이 누락됩니다. 주소로 직접 전달할 수 있지만, 해킹이 잘 되고 어떤 것도 할당하지 않습니다. :)

참고: 정수의 크기는 OS의 포인터 크기와 일치해야 하지만 현재 대부분의 시스템은 기본 64비트입니다.

#include <pthread.h>
#include <inttypes.h>
#include <stdio.h>

void *_thread_loop(void *p)
{
  uint64_t n = (uint64_t)p;

  printf("received %llu\n", n);

  return NULL;
}



int main(int argc, char const *argv[])
{
  pthread_t read_thread_id;
  uint64_t n = 42;
  pthread_create(&read_thread_id, NULL, _thread_loop, (void *)n);

  pthread_join(read_thread_id, NULL);
  return 0;
}

언급URL : https://stackoverflow.com/questions/19232957/pthread-create-and-passing-an-integer-as-the-last-argument

반응형