所以,我知道你们喜欢详细介绍,我保证会提供更多与他们真正相关的内容,但对于我的情况,你应该记住以下内容:
我该怎么做?
下面是我的主要功能
int main(int argc, char *argv[]) {
int i;
/* Verify the correct number of arguments were passed in */
if(argc != 4) {
fprintf(stderr, "USAGE:./main.out <INT> <INT> <INT>\n");
}
int mainSleepTime = atoi(argv[1]); /* Time in seconds for main to sleep */
int numProd = atoi(argv[2]); /* Number of producer threads */int numCons = atoi(argv[3]); /* Number of consumer threads */
/* Initialize the app */
initializeData();
/* Create the producer threads */
for(i = 0; i < numProd; i++) {
/* Create the thread */
pthread_create(&tid,&attr,producer,NULL);
}
/* Create the consumer threads */
for(i = 0; i < numCons; i++) {
/* Create the thread */
pthread_create(&tid,&attr,consumer,NULL);
}
/* Sleep for the specified amount of time in milliseconds */
/* Exit the program */
sleep(mainSleepTime);
printf("Exit the program\n");
exit(0);
}
现在程序在睡眠时间计算。但是,如果我改变N,我想测量执行M次执行所需的不同时间.InitializeData只是一个处理缓冲区的函数。我相信这个技巧应该在主要方面解决。有人能帮助我吗?
答案 0 :(得分:1)
请参阅以下示例:
struct
{
int nProducednProduced;
pthread_mutex_t producerMutex;
int nConsumed;
pthread_mutex_t consuerMutex;
} monitor;
monitor
是一个全局对象,可以从所有线程中看到,并在创建线程之前由main()
初始化。
生产者应该增加monitor.nProduced
并在达到M时停止/退出。
消费者增加monitor.nConsumed
并在到达M时停止/退出。
main()
监控monitor.nConsumed
并在达到M 或 时退出,只需等待所有生产者和消费者完成。
答案 1 :(得分:0)
只需编写一个可由生产者和消费者访问的全局函数,并使用互斥锁保护此函数的入口和出口点,以便安全地保护此关键部分免受多个同时访问。现在,在此函数中,您可以使用计数器来检查生产者生成的项目数以及使用者消耗的项目数。如果您在生产者生产项目之前的某个点从生产者代码调用此函数,则会发生这种情况。同样,您可以在消费者使用项目后调用此函数。