2014-10-12 64 views
0

我有一個程序,創建一個監視器(一次只能運行一個線程的抽象對象)多個線程測試C.我得到的錯誤似乎工作,但顯然失敗其他地方,我認爲由於每個線程都有自己的顯示器。通過結構時不兼容的類型

我需要以某種方式將結構或指針從一個程序傳遞到另一個程序,以便我可以確保它們都指向同一個程序。在這個實現中,我遇到了分段錯誤,我認爲如果沒有指導,更多的工作只會讓程序更加複雜。

定義這個Struct必須有一個更好的方法,而不是簡單地在兩個程序中定義它?

相關監視器代碼:

#define N 5 
#include<stdio.h> 
#include <pthread.h> 
#include<semaphore.h> 

struct cond { 
    int blocked; 
    sem_t sema,empty, full; 
    int count; 
    char buf[N]; 
}; 

void waitNotEmpty(struct cond mon); 
void waitNotFull(struct cond mon); 
//void signalNotEmpty(void); 
//void signalNotFull(void); 
struct cond spawnMonitor(void); 
void moninsert(char alpha, struct cond mon); 
char monremove(struct cond mon); 

struct cond spawnMonitor(void){ 
    struct cond mon; 
    sem_init(&mon.sema, 0, 1); 
    mon.blocked = 0; 
    sem_init(&mon.empty, 0, 0); 
    sem_init(&mon.full, 0, 1); 
    mon.count = 0; 
    int value; 
    sem_getvalue(&mon.sema, &value); 
    printf("INITIAL VALUE: %d\n", value); 
    return mon; 
} 

,並運行它的MonitorDemo程序:

#define N 10000000 
#include<stdio.h> 
#include <pthread.h> 
#include<semaphore.h> 


struct cond { 
    int blocked; 
    sem_t sema,empty, full; 
    int count; 
    char buf[N]; 
}; 

struct cond mon; 

void main (void) 
{ 

    void producer(); 
    void consumer(); 

    int i = 0; 
    pthread_t thread[10]; 
    mon = spawnMonitor(); 
    for(i = 0; i < 10; i++){ 
     pthread_create(&thread[i], NULL, (void *) producer, NULL); 
     i++; 
     pthread_create(&thread[i], NULL, (void *) consumer, NULL); 
    } 
} 
+0

有一個更好的方法來定義結構比在兩個程序中都有;你可以把它放在一個包含在這兩個程序中的頭文件中。但是當傳遞一個struct'錯誤時,這不會解決'不兼容的類型。如果您遇到此錯誤,請張貼演示錯誤的SSCCE,並指出錯誤發生在哪一行。 http://sscce.org/ – 2014-10-12 01:18:06

+0

請注意,您有不兼容的類型,因爲N在一個文件中是5,而在另一個文件中是1000,000!在你使用'pthread.h'的系統上void main()'是無效的(除非你在Windows上使用POSIX線程,這似乎不大可能)。您應該在頭文件中定義'struct'(它的所有方面,包括'N'的值)。 – 2014-10-12 01:27:58

+1

無關:你的'main()'處於一個受到傷害的世界中。只要這些線程全部啓動並且for循環完成,就不會有終止'main()'的任何操作。你甚至不會加入你生成的線程之一。我建議在重新訪問關於結構兼容性的書籍時說,對於你的pthread文本也是這樣。 – WhozCraig 2014-10-12 01:28:25

回答

0

我應該延遲主線程從此結束?也許某種時候 (線程!=完成)循環?

POSIX Threads Programming說,大約終止線程

  • 還有一定問題,如果主()如果你不叫pthread_exit()明確它催生了線程之前完成。它所創建的所有線程都將終止,因爲main()已經完成並且不再支持這些線程。
  • 通過讓main()顯式調用pthread_exit()作爲最後一件事情,main()將會阻塞並保持活動狀態以支持它創建的線程,直到它們完成爲止。