C语言 使用信号量的进程之间的互斥体



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

改用条件变量,很容易实现。使用以下示例:- 我通过使用 3 个线程而不是使用 fork() 来实现它。 我正在使用 3 个互斥体和 3 个条件。通过下面的示例,您可以在 C 中同步或控制任意数量的线程的执行。如果您在这里看到第一个线程,它锁定了互斥锁 lock1 并等待 cond1,同样,第二个线程锁定互斥锁 2 并等待条件 cond2 和第三个线程锁定互斥锁 锁 3 并等待条件 cond3。这是创建所有线程后的当前情况,现在所有线程都在等待信号在其条件变量上进一步执行。在主线程(即主函数,每个程序都有一个主线程,在 C/C++ 中,一旦控制通过内核传递给主方法,操作系统自动创建的这个主线程)我们调用 pthread_cond_signal(&cond1);一旦这个系统调用完成,正在等待 cond1 的线程 1 将被释放并开始执行。完成任务后,它将调用 pthread_cond_signal(&cond3);现在正在等待条件 cond3 的线程,即线程 3 将被释放,它将开始执行并将调用 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 thread1n");
do{
pthread_mutex_lock(&lock1);
pthread_cond_wait(&cond1, &lock1);
print("I am thread 1stn");
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 thread2n");
do
{
pthread_mutex_lock(&lock2);
pthread_cond_wait(&cond2, &lock2);
print("I am thread 2ndn");
pthread_cond_signal(&cond1);
pthread_mutex_unlock(&lock2);
}while(TRUE);
pthread_exit(NULL);
}
void * threadMethod3(void *arg)
{
printf("In thread3n");
do
{
pthread_mutex_lock(&lock3);
pthread_cond_wait(&cond3, &lock3);
print("I am thread 3rdn");
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 threadsn");
if( pthread_create(&tid1, NULL, threadMethod1, NULL) != 0 )
printf("Failed to create thread1n");
if( pthread_create(&tid2, NULL, threadMethod2, NULL) != 0 )
printf("Failed to create thread2n");
if( pthread_create(&tid3, NULL, threadMethod3, NULL) != 0 )
printf("Failed to create thread3n");
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);
}

最新更新