问题: 我必须增加 x1 和 x2 变量,这应该由单独的线程完成,并且两个变量的下一个增量不应该被调用,直到两个变量的前一个增量都没有完成。
建议的解决方案: 初始化 4 个信号量并调用单独的线程以单独增加变量。2个信号量用于将消息传递给线程以开始递增,2个信号量用于将消息传递给主线程以完成递增。主线程将等待来自两个子线程的信号量发布,显示两个变量的增量已完成,然后主线程将消息传递给两个子线程,允许进一步增量。
这个目前对我来说很好。但是,有人可以提出更好的解决方案吗?或者,任何人都可以指出这个解决方案中的问题吗? 任何帮助将不胜感激?提前致谢。
解决方案代码:
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
//Threads
pthread_t pth1,pth2;
//Values to calculate
int x1 = 0, x2 = 0;
sem_t c1,c2,c3,c4;
void *threadfunc1(void *parm)
{
for (;;) {
x1++;
sem_post(&c1);
sem_wait(&c3);
}
return NULL ;
}
void *threadfunc2(void *parm)
{
for (;;) {
x2++;
sem_post(&c2);
sem_wait(&c4);
}
return NULL ;
}
int main () {
sem_init(&c1, 0, 0);
sem_init(&c2, 0, 0);
sem_init(&c3, 0, 0);
sem_init(&c4, 0, 0);
pthread_create(&pth1, NULL, threadfunc1, "foo");
pthread_create(&pth2, NULL, threadfunc2, "foo");
sem_wait(&c1);
sem_wait(&c2);
sem_post(&c3);
sem_post(&c4);
int loop = 0;
while (loop < 8) {
// iterated as a step
loop++;
printf("Initial : x1 = %d, x2 = %d\n", x1, x2);
sem_wait(&c1);
sem_wait(&c2);
printf("Final : x1 = %d, x2 = %d\n", x1, x2);
sem_post(&c3);
sem_post(&c4);
}
sem_wait(&c1);
sem_wait(&c2);
sem_destroy(&c1);
sem_destroy(&c2);
sem_destroy(&c3);
sem_destroy(&c4);
printf("Result : x1 = %d, x2 = %d\n", x1, x2);
pthread_cancel(pth1);
pthread_cancel(pth2);
return 1;
}