2014-05-09 5 views
8

का उपयोग करके अनिर्धारित संदर्भ समस्याएं मैं सेमफोरस का उपयोग करने के साथ खेल रहा हूं, लेकिन मैं अनिर्धारित संदर्भ चेतावनियों का सामना करना जारी रखता हूं, इस प्रकार मेरा कोड काम नहीं करता है। मैंने एक पाठ से उदाहरण कोड खींचा, लेकिन उनके कुछ वाक्यविन्यास के साथ समस्याएं थीं, इसलिए मैं पॉज़िक्स के सेमफोर ट्यूटोरियल में गया और चीजों को उनके वाक्यविन्यास में बदल दिया और नतीजतन अब इन संदर्भ त्रुटियों को प्राप्त कर रहा हूं।सेमफोरस

मैं बस कुछ दिख रहा हूं, लेकिन मुझे यह नहीं मिल रहा है।

त्रुटियाँ:

Producers_Consumers.c:52: warning: return type of ‘main’ is not ‘int’ 
/tmp/cceeOM6F.o: In function `producer': 
Producers_Consumers.c:(.text+0x1e): undefined reference to `sem_init' 
Producers_Consumers.c:(.text+0x3a): undefined reference to `sem_init' 
Producers_Consumers.c:(.text+0x46): undefined reference to `sem_wait' 
Producers_Consumers.c:(.text+0x52): undefined reference to `sem_wait' 
Producers_Consumers.c:(.text+0x5e): undefined reference to `sem_post' 
Producers_Consumers.c:(.text+0x6a): undefined reference to `sem_post' 
/tmp/cceeOM6F.o: In function `consumer': 
Producers_Consumers.c:(.text+0x7e): undefined reference to `sem_wait' 
Producers_Consumers.c:(.text+0x8a): undefined reference to `sem_wait' 
Producers_Consumers.c:(.text+0x96): undefined reference to `sem_post' 
Producers_Consumers.c:(.text+0xa2): undefined reference to `sem_post' 
collect2: ld returned 1 exit status 

मैं क्या है मुझे यह भी पता मेरी जोड़ने विधि काम नहीं करेगा (यह एक सा बदसूरत वजह से जिस तरह से करने के लिए मैं अपने पुराने विधि से बाहर बातें टिप्पणी की दे सकते हैं), लेकिन मैं जब मैं अपने वाक्य रचना मुद्दों को ठीक करने के लिए है कि प्राप्त करेंगे:

#include <stdio.h> 
#include <semaphore.h> 
#include <string.h> 
#include <pthread.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <errno.h> 

#define N 10  //Number of slots in buffer 
typedef int semaphore; //Semaphores ae a special kind of int 
sem_t mutex; //Controls access to critical region 1 
sem_t empty; //Counts empty buffer slots N 
sem_t full; //Counts full buffer slots 0 
int count = 0; //What we're putting in 
//int buffer[N]; 

void producer(void) { 
    sem_init(&mutex, 0, 1); 
    //sem_init(&empty, 0, N); 
    sem_init(&full, 0, 0); 

    while(1) { 
     sem_wait(&empty); 
     sem_wait(&mutex); 
     //printf("Empy: %d\n",empty); 
     //printf("Mutex: %d\n",mutex); 
     //printf("Both Downs Ran\n"); 
     //buffer = buffer + 1; 
     sem_post(&mutex); 
     sem_post(&full); 
     //printf("Producer produced: %d\n",buffer); 
    } 
} 

void consumer(void) { 
    while(1) { 
     sem_wait(&full); 
     sem_wait(&mutex); 
     //item = buffer; 
     sem_post(&mutex); 
     sem_post(&empty); 
     //printf("Consumer consumed: %d/n",item); 
    } 
} 

void main() { 

} 
+0

क्या आप सटीक त्रुटियां पोस्ट कर सकते हैं? – GoldRoger

+0

टर्मिनल से कॉपी की गई त्रुटियों के साथ मूल पोस्ट अपडेट किया गया। – TheFatness

उत्तर

17

आप एक Linux सिस्टम पर हैं, तो आप pthreads पुस्तकालय से जोड़ने के लिए -pthread ध्वज के साथ संकलन और लिंक की आवश्यकता होगी।

gcc -pthread Producers_Consumers.c 

पॉल ग्रीफिथ के रूप में आप भी -lrt, जो और अधिक पोर्टेबल है उपयोग कर सकते हैं ने कहा है, और POSIX रीयलटाइम एक्सटेंशन पुस्तकालय

gcc Producers_Consumers.c -lrt 

  • int main(void) नहीं void main()
  • लिंक typedef int semaphore गलत है, sem_t को अपारदर्शी प्रकार के रूप में माना जाना चाहिए , आप इस कोड टाइप को अपने कोड में कभी भी इस्तेमाल नहीं करते हैं।
  • एक समस्या मुझे पता है कि consumer कोड producer में प्रारंभ होने से पहले सेमफोर का उपयोग करता है। आपको उन्हें अपने main
+0

मैंने हमेशा सोचा था कि सेमफोर एपीआई pthreads से संबंधित नहीं था ... – glampert

+0

आपको '-lrt' की आवश्यकता हो सकती है, और पुस्तकालयों को '.c' फ़ाइल के बाद जाना चाहिए। –

+0

वाह। बस वाह। मुझे पता था कि मैं कुछ सरल दिख रहा था। इसने मेरा मूल मुद्दा हल किया। धन्यवाद! मुख्य के लिए ... मुझे पता है, मैं प्रयोग कर रहा था और इसे वापस बदलने के लिए भूल गया था! – TheFatness

2

में प्रारंभ करना चाहिए ubuntu qt में एक ही त्रुटि मिली।

LIBS जोड़ने के बाद + = -lpthread -lrt

project.pro करने के लिए फ़ाइल सब ठीक संकलित।

संबंधित मुद्दे