互斥锁不能保证在临界区的时候,不发送任务调度,所以为了保护共享的资源不被调度访问,需要在两个线程都加互斥锁来保证任务不调度
#include <stdio.h>
#include <pthread.h>
#include <unistd.h> int shared_resource = 0;pthread_mutex_t mutex;void *thread_function(void *arg)
{while (1){printf("0\n");pthread_mutex_lock(&mutex);printf("1\n");sleep(2);printf("2\n");pthread_mutex_unlock(&mutex);printf("3\n");}pthread_exit(NULL);
}
void *thread_function1(void *arg)
{while (1){printf("thread_function1\n");sleep(1);}pthread_exit(NULL);
}int main()
{pthread_t threads[2];pthread_mutex_init(&mutex, NULL);int result = pthread_create(&threads[0], NULL, thread_function, NULL);int result1 = pthread_create(&threads[1], NULL, thread_function1, NULL);for (int i = 0; i < 2; i++){pthread_join(threads[i], NULL);}pthread_mutex_destroy(&mutex);return 0;
}
运行结果如下:
在多线程环境中,只有当一个线程持有互斥锁并进入临界区时,其他线程才会被阻塞,直到该锁被释放。因此,在你的代码中,即使 thread_function
获取到了 mutex
互斥锁并进入临界区,thread_function1
仍然可以被任务调度器调度并运行,因为它没有尝试获取 mutex
锁。
所以,即使 thread_function
正在执行临界区操作,thread_function1
也可以被调度器执行,因为它不受 mutex
的影响,没有在临界区内等待互斥锁。
我确认一下:在你的代码中,虽然 thread_function
使用了互斥锁来保护临界区(即共享资源的访问),而 thread_function1
没有使用任何互斥手段。这意味着以下情况可能发生:
-
调度行为: 当
thread_function
获取到互斥锁mutex
并进入临界区时,它会阻止其他尝试获取同一mutex
的线程(如其他thread_function
实例或其他使用mutex
的线程)进入临界区。这是互斥锁的基本特性,确保在任意时刻只有一个线程可以访问共享资源。 -
未受影响的线程:
thread_function1
没有获取mutex
锁,因此它不受mutex
的保护或阻塞。这意味着即使thread_function
正在执行其临界区代码,thread_function1
也可以由调度器选择执行,因为它不需要等待或竞争mutex
锁。
综上所述,即使 thread_function
正在使用互斥锁保护共享资源,thread_function1
仍然可以在 thread_function
执行临界区时被调度执行。这是因为 thread_function1
没有与 mutex
相关联,不会被 mutex
的锁定状态所阻塞。