我有一个为监视器创建多个线程的程序(一次只运行一个线程的抽象对象)在C中进行测试。我遇到了错误,它似乎工作但很明显在其他地方失败,我认为由于每个线程得到自己的显示器。
我需要以某种方式将结构或指针从一个程序传递给另一个程序,以便我可以确保它们都指向同一个程序。在这个实现中,我得到一个分段错误,我认为没有指导的更多工作只会使程序更复杂。
必须有一种更好的方法来定义这个结构,而不仅仅是在两个程序中定义它?
相关监控代码:
#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 :(得分:0)
我应该延迟主线程结束吗?某种程度的 (线程!=完成)也许循环?
POSIX Threads Programming说终止帖子:
pthread_exit()
,如果main()在它产生的线程之前完成,那么肯定存在问题。它创建的所有线程都将终止,因为main()已完成且不再存在以支持线程。pthread_exit()
作为它做的最后一件事,main()将阻塞并保持活动状态以支持它创建的线程,直到它们完成。