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);
- 값을 읽으려면 초기화해야 합니다.
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
'programing' 카테고리의 다른 글
MacOS에서 아나콘다를 완전히 제거하는 방법 (0) | 2023.06.25 |
---|---|
SQL 쿼리에 대한 기본 스키마 설정 (0) | 2023.06.25 |
파이썬의 제네릭/템플릿? (0) | 2023.06.20 |
3항 연산자가 R에 존재합니까? (0) | 2023.06.20 |
SpringBoot 1.4에서 SpringMVC 슬라이스 테스트 문제 (0) | 2023.06.20 |