【发布时间】:2019-05-25 19:02:43
【问题描述】:
大家晚上好,
我还在学习实时编程,我正在尝试使用信号量同步两个线程,第一个线程计算总和并返回一个值(总和)。总和将作为参数传递给第二个线程,该线程将使用它来计算平均值(这只是操纵信号量的示例)。我现在的问题是这两个任务不是周期性的,因为一旦线程返回结果,它就会离开循环,而 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;
}
【问题讨论】:
-
现在仔细查看代码,因为它已格式化。主要问题应该很明显。
-
另外,
pthread_create后面紧跟pthread_join表示您不是真正多线程,因为您启动线程然后等待它完成再继续。 -
是的,但是当我在“pthread_create”之后创建“pthread_join”时,执行将被阻止!!!
-
你现在写东西的方式,
th1必须在你开始th2之前完成。这不是多线程。 -
还要注意
return语句会导致当前函数立即返回。它不只是继续。
标签: c pthreads real-time semaphore