누군가 내 코드를 확인하고 내가 올바른 길을 가고 있는지 말해 줄 수 있나? 내가 조금은 잃어버린 것처럼 보인다. 내 실수를 본다면, 내게 그걸 알려줘 ..한정된 버퍼를 가진 프로듀서/소비자
내가하려는 것은 GCD뿐 아니라 내 자신의 세마포어를 사용하여 바운드 버퍼를 해결하는 것입니다. 사전에
감사합니다 ..
sema.c
void procure(Semaphore *semaphore) {
pthread_mutex_lock(semaphore->mutex1);
while(semaphore->value <= 0)
pthread_cond_wait(&semaphore->condition, semaphore->mutex1);
semaphore->value--;
pthread_mutex_unlock(semaphore->mutex1);
}
void vacate(Semaphore *semaphore) {
pthread_mutex_lock(semaphore->mutex1);
semaphore->value++;
pthread_cond_signal(&semaphore->condition);
pthread_mutex_unlock(semaphore->mutex1);
}
void init (Semaphore *semaphore){
semaphore->value = 1;
pthread_mutex_t myMutex;
semaphore->mutex1 = &myMutex;
pthread_mutex_init(semaphore->mutex1, NULL);
}
void destroy (Semaphore *semaphore) {
pthread_mutex_destroy(semaphore->mutex1);
}
과 당신의 코드는 버그가
struct variables {
Semaphore *sem;
};
struct variables vars;
void constructer (int *buffer, int *in, int *out) {
init(vars.sem);
}
void deconstructer() {
destroy(vars.sem);
}
int rand_num_gen() {
uint_fast16_t buffer;
int file;
int *rand;
file = open("/dev/random", O_RDONLY);
while(1) {
read(file, &buffer, sizeof(buffer));
printf("16 bit number: %hu\n", buffer);
*rand = (int) buffer;
close(file);
break;
}
return *rand;
}
void put_buffer(int* buffer, int* in, int* out) {
buffer[*in] = rand_num_gen(); // produce
procure(vars.sem); // wait here
*in = (*in + 1) % BUF_SIZE;
vacate(vars.sem);
}
void get_buffer(int* buffer, int* in, int* out) {
int value;
procure(vars.sem);
value = buffer[*out];
vacate(vars.sem);
*out = (*out + 1) % BUF_SIZE;
}
int main (void) {
int *in, *out, *buffer;
constructer(buffer, in, out);
dispatch_queue_t producer, consumer;
producer = dispatch_queue_create("put_buffer", NULL);
consumer = dispatch_queue_create("get_buffer", NULL);
dispatch_async(producer,
^{
int i;
do
{
put_buffer(buffer, in, out);
dispatch_async(consumer,
^{
get_buffer(buffer, in, out);
if (i == RUN_LENGTH) exit(EXIT_SUCCESS);
});
}
while (i < RUN_LENGTH);
});
dispatch_main();
deconstructer();
exit (0);
}
여기에 잘못된 액세스가 발생합니다. 'buffer [* in] = rand_num_gen(); 어떻게 해결할 수 있습니까? – canaan
그 언어는 무엇입니까? C에는 람다 ('^') 연산자가 없습니다. –