gpt4 book ai didi

c - 使用信号量的进程之间的互斥

转载 作者:行者123 更新时间:2023-11-30 14:50:18 25 4
gpt4 key购买 nike

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

最佳答案

使用条件变量代替,更容易实现。使用以下示例:-我使用 3 个线程而不是使用 fork() 来实现它。我使用 3 个互斥锁和 3 个条件。通过下面的示例,您可以同步或控制 C 中任意数量线程的执行。如果您在这里看到第一个线程,它锁定了互斥锁 lock1 并等待 cond1,同样第二个线程锁定了互斥锁 lock2 并等待条件 cond2,第三个线程锁定了互斥锁lock3 并等待条件 cond3。这是所有线程创建后的当前情况,现在所有线程都在等待信号以对其条件变量进一步执行。在主线程(即主函数,每个程序都有一个主线程,在 C/C++ 中,一旦内核将控制权传递给 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\n");
do{
pthread_mutex_lock(&lock1);
pthread_cond_wait(&cond1, &lock1);
print("I am thread 1st\n");
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\n");
do
{
pthread_mutex_lock(&lock2);
pthread_cond_wait(&cond2, &lock2);
print("I am thread 2nd\n");
pthread_cond_signal(&cond1);
pthread_mutex_unlock(&lock2);
}while(TRUE);
pthread_exit(NULL);
}

void * threadMethod3(void *arg)
{
printf("In thread3\n");
do
{
pthread_mutex_lock(&lock3);
pthread_cond_wait(&cond3, &lock3);
print("I am thread 3rd\n");
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\n");
if( pthread_create(&tid1, NULL, threadMethod1, NULL) != 0 )
printf("Failed to create thread1\n");
if( pthread_create(&tid2, NULL, threadMethod2, NULL) != 0 )
printf("Failed to create thread2\n");
if( pthread_create(&tid3, NULL, threadMethod3, NULL) != 0 )
printf("Failed to create thread3\n");
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);
}

关于c - 使用信号量的进程之间的互斥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49073328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com