작은 동기화 문제를 해결하려고합니다. 하지만 스레드에 가입하면 다섯 번째 반복의 세그먼트 오류가 발생합니다! 난 단지 4 스레드가 완벽하게 작동하도록 만듭니다.세그멘테이션 오류가 스레드 번호 5 (pthread_join)에 합류했습니다.
여기 스레드를 수행 할 수있는 몇 가지 기본 사항이있는 코드를 남깁니다. 와
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <semaphore.h>
sem_t HackersEmploy_Counter;
int hackerOnBoat, employOnBoat, B, b, hackerResagado, employResagado;
sem_t Board;
int onBoatId[4];
char onBoatType[4];
sem_t Bote;
typedef struct{
FILE* log;
int ID;
}param;
void* HackerArrive(void* para){
param* var = (param*) para;
printf("Create Hacker %i\n", var->ID-1);
pthread_exit(0);
}
void* EmployeeArrive(void* para){
param* var = (param*) para;
printf("Create Employee %i\n", var->ID-1);
pthread_exit(0);
}
int main(int argc, char **argv) {
sem_init(&HackersEmploy_Counter,0,1);
sem_init(&Bote,0,4);
sem_init(&Board,0,1);
FILE* log;
log = fopen("result_simulacion.txt", "w");
int E, e=1, H, h=1, i, r;
hackerOnBoat=0; employOnBoat=0; b=1; hackerResagado=0; employResagado=0;
for (i=1; i<argc; i++){
if (strcmp(argv[i],"-h")==0){
i++;
H = atoi(argv[i]);
}
if (strcmp(argv[i],"-e")==0){
i++;
E = atoi(argv[i]);
}
if (strcmp(argv[i],"-b")==0){
i++;
B = atoi(argv[i]);
}
}
pthread_t* bank = (pthread_t*) malloc((E+H) * sizeof (pthread_t*));
param* var = (param*) malloc((E+H) + sizeof (param*));
for (i=0; i<H+E; i++){
r = rand() % 2;
if (r==0){
if (h<=H){
var[i].log = log;
var[i].ID = h;
pthread_create(&bank[i], NULL, HackerArrive, (void*) &var[i]);
h++;
}else{
var[i].log = log;
var[i].ID = e;
pthread_create(&bank[i], NULL, EmployeeArrive, (void*) &var[i]);
e++;
}
}else{
if (e<=E){
var[i].log = log;
var[i].ID = e;
pthread_create(&bank[i], NULL, EmployeeArrive, (void*) &var[i]);
e++;
}else{
var[i].log = log;
var[i].ID = h;
pthread_create(&bank[i], NULL, HackerArrive, (void*) &var[i]);
h++;
}
}
}
for (i=0; i<E+H; i++){
pthread_join(bank[i], NULL);
printf("join %i\n", i);
}
return 0;
}
실행 : ./work -h 4 -e 0 -b 1
그들과 함께 실행 ./work -h 5 -e 0 -b 1
가 "-h"의 값을 증가하면 4 개 이상이 세그먼트 오류
왜이 나타납니다?
초기 개정으로 롤백했습니다. (그들이 해결되었으므로 찾을 수없는 분명한 오류를 찾기 위해 10 분을 소비 한 후) 문제의 오류를 수정하면 향후 독자에게 Q & A가 쓸모 없게됩니다. – wildplasser