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);
}
}
有一個更好的方法來定義結構比在兩個程序中都有;你可以把它放在一個包含在這兩個程序中的頭文件中。但是當傳遞一個struct'錯誤時,這不會解決'不兼容的類型。如果您遇到此錯誤,請張貼演示錯誤的SSCCE,並指出錯誤發生在哪一行。 http://sscce.org/ – 2014-10-12 01:18:06
請注意,您有不兼容的類型,因爲N在一個文件中是5,而在另一個文件中是1000,000!在你使用'pthread.h'的系統上void main()'是無效的(除非你在Windows上使用POSIX線程,這似乎不大可能)。您應該在頭文件中定義'struct'(它的所有方面,包括'N'的值)。 – 2014-10-12 01:27:58
無關:你的'main()'處於一個受到傷害的世界中。只要這些線程全部啓動並且for循環完成,就不會有終止'main()'的任何操作。你甚至不會加入你生成的線程之一。我建議在重新訪問關於結構兼容性的書籍時說,對於你的pthread文本也是這樣。 – WhozCraig 2014-10-12 01:28:25