信号量不会在C.工作。为什么?

时间:2016-08-02 10:34:25

标签: c multithreading cygwin semaphore


首先,我是意大利人,抱歉我的英语不好 无论如何,我应该做这个练习:
"在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终端 提前谢谢。

3 个答案:

答案 0 :(得分:1)

pthread_mutex_t不是信号量(尽管如果你用“V”将信号量初始化为“free”,信号量可以用作互斥量)。信号量API为sem_initsem_postsem_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,它们可以提供更大的自由度,还可以具有互斥锁功能。