티스토리 뷰

스레드가 실행되기 시작하면 존재하지 않거나 적어도 여러 스레드에서 볼 수 있거나 한 스레드가 쓰는 동안 다른 스레드가 읽는 동안 데이터 경합 인 변수의 주소를 전달합니다.

일반적인 해결책은 스레드의 인수와 결과를 모두 동적으로 할당하고 호출자와 스레드가 이러한 방식으로 통신하도록하는 것입니다.

예:

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

struct threadargs {
    int x;
        int y;
        };
        
        struct threadresults {
            int sum;
                int product;
                };
                
                void* threadfunc(void* args_void) {
                    // Get thread args in usable type.
                        struct threadargs* args = args_void;
                            struct threadresults* results = NULL;
                            
                                //Compute.
                                    int sum = args->x + args->y;
                                        int product = args->x * args->y;
                                        
                                            // Return the result.    
                                                results = malloc(sizeof(*results));
                                                    results->sum = sum;
                                                        results->product = product;
                                                        
                                                            free(args);
                                                                return results;
                                                                }
                                                                
                                                                int main()
                                                                {
                                                                    pthread_t thread[2][2];
                                                                        struct threadresults* results[2][2] = {0};
                                                                        
                                                                            int i, j;
                                                                                for (i = 0;i < 2; ++i) {
                                                                                        for (j = 0; j < 2; ++j) {
                                                                                                    struct threadargs* args = malloc(sizeof(*args));
                                                                                                                args->x = i;
                                                                                                                            args->y = j;
                                                                                                                            
                                                                                                                                        pthread_create(&thread[i][j], NULL, threadfunc, args);
                                                                                                                                                }
                                                                                                                                                    }
                                                                                                                                                    
                                                                                                                                                        for (i = 0; i < 2; i++) {
                                                                                                                                                                for (j = 0; j < 2; j++) {
                                                                                                                                                                            void* result;
                                                                                                                                                                                        pthread_join(thread[i][j], &result);
                                                                                                                                                                                                    results[i][j] = result;
                                                                                                                                                                                                            }
                                                                                                                                                                                                                }
                                                                                                                                                                                                                
                                                                                                                                                                                                                    for (i = 0; i < 2; i++) {
                                                                                                                                                                                                                            for (j = 0; j < 2; j++) {
                                                                                                                                                                                                                                        printf("sum: %d\tproduct: %d\n",
                                                                                                                                                                                                                                                           results[i][j]->sum, results[i][j]->product);
                                                                                                                                                                                                                                                                   }
                                                                                                                                                                                                                                                                       }
                                                                                                                                                                                                                                                                       
                                                                                                                                                                                                                                                                           for (i = 0; i < 2; i++) {
                                                                                                                                                                                                                                                                                   for (j = 0; j < 2; j++) {
                                                                                                                                                                                                                                                                                               free(results[i][j]);
                                                                                                                                                                                                                                                                                                       }
                                                                                                                                                                                                                                                                                                           }
                                                                                                                                                                                                                                                                                                           
                                                                                                                                                                                                                                                                                                               return 0;
                                                                                                                                                                                                                                                                                                               }
                                                                                                                                                                                                                                                                                                               


출처
https://stackoverflow.com/questions/39970033
댓글
공지사항
Total
Today
Yesterday
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31