我不知道为什么我的信号量和互斥量无法正常工作

时间:2014-02-09 12:09:06

标签: multithreading pthreads posix mutex semaphore

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <pthread.h>
#include <semaphore.h>

#define MAX_STDNT 10

pthread_mutex_t ta;
//sem_t ta; //the ta is the semaphore

//void *request_and_help(void *arg)
//{
//  pthread_t cur_thread = pthread_self();
//
//  if (sem_wait(&ta) == -1) {
//      printf("TA is busy.... student(%d) programming....\n");
//  } else {
//      printf("student(%d) requesting help....\n", cur_thread);
//      sleep(1);
//      printf("TA is helping student(%d)....\n", cur_thread);
//      sleep(1);
//      printf("student(%d) DONE!!!\n", cur_thread);
//      sem_post(&ta);  //signal other waiting students to come in
//  }
//}

void *request_and_help(void *arg)
{
    pthread_t cur_thread = pthread_self();

    if (pthread_mutex_lock(&ta) != 0) {
        printf("TA is busy.... student(%d) programming....\n");
    } else {
        printf("student(%d) requesting help....\n", cur_thread);
        sleep(1);
        printf("TA is helping student(%d)....\n", cur_thread);
        sleep(1);
        printf("student(%d) DONE!!!\n", cur_thread);
        pthread_mutex_unlock(&ta);
    }

}

int main(int argc, char *argv[])
{
    int i;
    pthread_t stdnt[MAX_STDNT];

    //sem_init(&ta, 0, 1);
    pthread_mutex_init(&ta, NULL);

    for (i = 0; i < MAX_STDNT; i++)
        pthread_create(&stdnt[i], NULL, request_and_help, NULL);
    for (i = 0; i < MAX_STDNT; i++)
        pthread_join(stdnt[i], NULL);
}

我对此代码的意图是了解线程应用程序编程的POSIX APIS如何工作。

以下是它的工作原理,ta作为信号量(或互斥量),学生们将获得帮助 一次一个。如果TA忙(这意味着线程获得锁定,它打印“忙”,等待线程被描述为“编程”。事实上,如果我编译这个程序并执行它,就没有等待消息。

至少有一个线程必须获得信号量资源(或互斥量)并且它将在1秒钟内休眠2次,这意味着其他线程(显然可能已经输入)必须等待sempahore资源(或互斥量)我通过打印检查“TA正忙着学生正在编程”。

但是当我执行程序时,我没有看到任何消息。 这个代码我有两个版本的信号量和互斥量,我发布的是一个 目前使用互斥锁。有人能帮助我吗?

P.S我的环境是windows上的cygwin并使用多线程处理器上网本

1 个答案:

答案 0 :(得分:0)

如果在已锁定的互斥锁上调用pthread_mutex_lock(),则会阻塞,直到相关的互斥锁解锁为止。

要实现您想要的行为,您可能希望使用pthread_mutex_trylock(),如下所示:

void * request_and_help(void * arg)
{
  pthread_t cur_thread = pthread_self();

  int result = pthread_mutex_trylock(&ta);
  if (0 != result)
  {
    if (EBUSY == result) 
    {
      printf("TA is busy.... student(%d) programming....\n", cur_thread);
    }
    else
    {
      errno = result;
      perror("pthread_mutex_trylock() failed");
    }
  } 
  else 
  {
    [...]