使用信号量的进程之间的互斥[关闭]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用信号量的进程之间的互斥[关闭]相关的知识,希望对你有一定的参考价值。

我有20个两种类型的过程(A和B)。 A进程必须在共享内存上写入,当所有编写器都已写入时,B进程必须读取该内存。如何使用信号量管理这个?我应该使用多少个信号量?

答案

使用条件变量,很容易实现。使用下面的示例: - 我通过使用3个线程而不是使用fork()来实现它。我使用3个互斥锁和3个条件。使用下面的示例,您可以同步或控制C中任意数量的线程的执行。如果您在此处看到第一个线程,它锁定了互斥锁1并等待cond1,同样第二个线程锁定了互斥锁lock2并等待条件cond2和第3个线程锁定互斥锁lock3并在cond3条件下等待。这是创建它们之后所有线程的当前情况,现在所有线程都在等待信号在其条件变量上进一步执行。在主线程中(即main函数,每个程序都有一个主线程,在C / C ++中这个主线程由操作系统自动创建,一旦控制传递给kernal的main方法)我们调用pthread_cond_signal(&cond1);一旦这个系统调用完成,在cond1上等待的thread1将被释放,它将开始执行。一旦完成任务,它将调用pthread_cond_signal(&cond3);现在正在等待条件cond3的线程,即thread3将被释放,它将开始执行并将调用pthread_cond_signal(&cond2);这将释放在条件cond2上等待的线程,即在这种情况下为thread2。这是我们在多线程环境中调度,同步和确定线程优先级的方法。我想让你玩这个例子。在这里我控制3个线程,在你的情况下你只需要控制两个线程。

pthread_cond_t cond1 = PTHREAD_COND_INITIALIZER;
pthread_cond_t cond2 = PTHREAD_COND_INITIALIZER;
pthread_cond_t cond3 = PTHREAD_COND_INITIALIZER;
pthread_mutex_t lock1 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t lock2 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t lock3 = PTHREAD_MUTEX_INITIALIZER;

int TRUE = 1;

void print(char *p)
{
  printf("%s",p);
}

void * threadMethod1(void *arg)
{
  printf("In thread1
");
  do{
    pthread_mutex_lock(&lock1);
    pthread_cond_wait(&cond1, &lock1);
    print("I am thread 1st
");
    pthread_cond_signal(&cond3);/* Now allow 3rd thread to process */
    pthread_mutex_unlock(&lock1);
  }while(TRUE);
  pthread_exit(NULL);
}

void * threadMethod2(void *arg)
{
  printf("In thread2
");
  do
  {
    pthread_mutex_lock(&lock2);
    pthread_cond_wait(&cond2, &lock2);
    print("I am thread 2nd
");
    pthread_cond_signal(&cond1);
    pthread_mutex_unlock(&lock2);
  }while(TRUE);
  pthread_exit(NULL);
}

void * threadMethod3(void *arg)
{
  printf("In thread3
");
  do
  {
    pthread_mutex_lock(&lock3);
    pthread_cond_wait(&cond3, &lock3);
    print("I am thread 3rd
");
    pthread_cond_signal(&cond2);
    pthread_mutex_unlock(&lock3);
  }while(TRUE);
  pthread_exit(NULL);
}

int main(void)
{
  pthread_t tid1, tid2, tid3;
  int i = 0;

  printf("Before creating the threads
");
  if( pthread_create(&tid1, NULL, threadMethod1, NULL) != 0 )
        printf("Failed to create thread1
");
  if( pthread_create(&tid2, NULL, threadMethod2, NULL) != 0 )
        printf("Failed to create thread2
");
  if( pthread_create(&tid3, NULL, threadMethod3, NULL) != 0 )
        printf("Failed to create thread3
");
  pthread_cond_signal(&cond1);/* Now allow first thread to process first */


  sleep(1);
  TRUE = 0;/* Stop all the thread */
  sleep(3);

 /* this is how we join thread before exit from a system */
  /*  
  pthread_join(tid1,NULL);
  pthread_join(tid2,NULL);
  pthread_join(tid3,NULL);*/

 exit(0);
}

以上是关于使用信号量的进程之间的互斥[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

linux内核 —— 读写信号量实验

使用互斥锁调节两个进程之间的 IPC

守护进程,模拟抢票例子,互斥锁,信号量,队列总结

读写锁 与 互斥锁

进程经典问题总结

进程经典问题总结