首先,我是意大利人,抱歉我的英语不好
无论如何,我应该做这个练习:
"在C中写入生成线程的程序。主显示从1到9的奇数,线程显示从2到10的偶数。使用信号量同步主线程和#34;
我用这种方式编写了伪代码:
//semaphores
semParent = free
semChild = busy
main
generate thread "child"
for i=1 to 9 step 2
P(semParent)
print i
V(semChild)
end for
end main
child
for i=2 to 10 step 2
P(semChild)
print i
V(semParent)
end child
这就是我在C中实现的方式:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
pthread_mutex_t semParent;
pthread_mutex_t semChild = PTHREAD_MUTEX_INITIALIZER;
void* functionChild (void* arg) {
for(int i=2; i<=10; i+=2) {
pthread_mutex_lock(&semChild);
printf("CHILD: %d\n",i);
pthread_mutex_unlock(&semParent);
}
return NULL;
}
int main(void) {
pthread_t child;
pthread_create(&child, NULL, &functionChild, NULL);
pthread_mutex_init(&semParent, NULL);
for(int i=1; i<=9; i+=2) {
pthread_mutex_lock(&semParent);
printf("PARENT : %d\n",i);
pthread_mutex_unlock(&semChild);
}
pthread_join(child, NULL);
}
但是每当我运行程序时输出总是不同的。
怎么了?
我在Windows 10 64位中使用CygWin64终端
提前谢谢。
答案 0 :(得分:1)
pthread_mutex_t
不是信号量(尽管如果你用“V”将信号量初始化为“free”,信号量可以用作互斥量)。信号量API为sem_init
,sem_post
和sem_wait
。
在另一个线程锁定的互斥锁上使用pthread_mutex_unlock
,程序触发了未定义的行为。
答案 1 :(得分:0)
这可能不是您现在遇到的问题的原因,但您绝不应在多线程程序中使用printf()。 printf()写入缓冲区并且不会立即打印到屏幕上。相反,你应该使用sprintf()并写:
char buff[20];
sprintf("PARENT: %d\n", i);
write(1, buff, strlen(buff));
答案 2 :(得分:-1)
我认为pthread_mutex_init(&semParent, NULL)
具有NULL属性和PTHREAD_MUTEX_INITIALIZER
具有相同的效果,这两个锁都被初始化为解锁。你的问题虽然没有严格意义的关键部分。所以更好的解决方案应该是@Serhio提到的条件变量。您还可以查看信号量http://www.csc.villanova.edu/~mdamian/threads/posixsem.html,它们可以提供更大的自由度,还可以具有互斥锁功能。