大家晚上好
我仍在学习实时编程,并且尝试使用信号量同步两个线程,第一个线程计算总和并返回一个值(总和)。总和将作为参数传递给第二个线程,第二个线程将使用它来计算平均值(这只是操作信号量的一个示例)。我现在的问题是,这两个任务不是周期性的,因为一旦线程返回结果,它将退出循环,而main()完成工作!现在如何制作任务期?感谢您的帮助,这是我的源代码。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
sem_t evt;
//first task
void *tache1(void *arg)
{
int j;
int s=0;
struct timespec time;
clock_gettime(CLOCK_REALTIME, &time);
while(1){
printf("first THREADDDDDDDDD \n");
for(j=0; j<100; j++)
s= s + j;
return (void*) s;
sem_post(&evt);
sleep(3);
}
}
//second task
void *tache2(void *arg){
int moyenne = 1;
int sum = *((int*) arg);
struct timespec time;
clock_gettime(CLOCK_REALTIME, &time);
while(3){
sem_wait(&evt);
printf("second THREADDDDDDDDD \n");
moyenne= sum/10;
return(void*)moyenne;
sleep(2);
}
}
int main()
{
pthread_t th1, th2;
int sum;
int moyenne;
int status;
sem_init(&evt, 0,0);
printf("start main\n") ;
pthread_create(&th1, NULL, tache1, NULL);
pthread_join(th1, (void*) &sum);
pthread_create(&th2, NULL, tache2, &sum);
pthread_join(th2, (void*) &moyenne);
printf("the sum in the main is %d.\n", sum);
printf("AVG %d.\n", moyenne);
printf("End main\n") ;
return 0;
}
答案 0 :(得分:0)
执行此操作时:
pthread_create(&th1, NULL, tache1, NULL);
pthread_join(th1, (void*) &sum);
pthread_create(&th2, NULL, tache2, &sum);
pthread_join(th2, (void*) &moyenne);
您启动一个线程,等待它完成,然后启动另一个线程,然后等待该线程完成。那不是多线程。您希望两个线程同时处于活动状态。
此外,您的两个线程函数都包含一个return
语句,其后还有更多语句。命中return
语句后,整个函数将立即返回。执行之后没有任何语句。还要注意,在这两个函数中都不需要while (1)
(或while (3)
)循环。
信号量(和互斥体)背后的想法是多个线程同时运行,并且两个线程都需要对全局数据进行操作,因此一个线程需要等待另一个线程执行某些操作才能访问全局数据。
因此,使sum
和moyenne
全局变量,立即启动两个线程,并摆脱线程函数中的多余循环。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
sem_t evt;
int sum;
int moyenne;
void *tache1(void *arg)
{
int j;
int s=0;
printf("first THREADDDDDDDDD \n");
for(j=0; j<100; j++)
s= s + j;
sum = s;
sem_post(&evt);
return NULL;
}
void *tache2(void *arg)
{
sem_wait(&evt);
printf("second THREADDDDDDDDD \n");
moyenne= sum/10;
return NULL;
}
int main()
{
pthread_t th1, th2;
sem_init(&evt, 0,0);
printf("start main\n") ;
pthread_create(&th1, NULL, tache1, NULL);
pthread_create(&th2, NULL, tache2, NULL);
pthread_join(th1, NULL);
pthread_join(th2, NULL);
printf("the sum in the main is %d.\n", sum);
printf("AVG %d.\n", moyenne);
printf("End main\n") ;
return 0;
}