📜  门| GATE-CS-2015(套装2)|第 47 题(1)

📅  最后修改于: 2023-12-03 15:12:42.747000             🧑  作者: Mango

GATE-CS-2015(套装2)- 第 47 题

这是一道关于线程同步的问题。考虑到在多线程环境下,竞态条件 (race condition) 可能会导致不确定的结果,在同步线程之前必须解决此问题。这可以通过锁定共享资源、使用互斥量、信号量等方法来解决。

该问题描述了一个情况,在该情况下,五个线程在共享同一资源时执行。

for(int i=0; i<5; i++) {
    fork();
    pthread_mutex_lock(&mutex);
    printf("Locked\n");
    pthread_mutex_unlock(&mutex):
}

该代码片段使用fork函数创建新进程,并在每个进程中使用pthread_mutex_lock() 和pthread_mutex_unlock() 锁定和解锁共享资源。

接下来,请回答以下问题:

  1. 当这段代码段运行时,会创建多少个进程?

  2. 每个进程会执行多少次printf语句?

  3. 事件的正确顺序是什么?

关于此问题,我建议您了解线程同步和Unix进程概念。 答案如下:

1. 为每个fork()调用创建一个新进程。因此,总共创建2^5个(即32个)进程。

2. 由于每个进程都具有其自己的printf()语句,每个进程将执行一次printf()语句。因此,总共会有32次printf()函数执行。

3. 事件的正确顺序如下:

- 进程1创建
- 进程2创建
- 进程3创建
- 进程4创建
- 进程5创建
- 进程1锁定共享资源
- 进程1解锁共享资源
- 进程2锁定共享资源
- 进程2解锁共享资源
- 进程3锁定共享资源
- 进程3解锁共享资源
- 进程4锁定共享资源
- 进程4解锁共享资源
- 进程5锁定共享资源
- 进程5解锁共享资源