執行緒中呼叫fork函式,鎖的變化
一、執行緒中呼叫fork函式鎖的變化
舉例說明:在下列程式碼中的排程變化。
但是在fork前加鎖再解鎖不安全,所以在fork函式裡引用pthread_atfork(prepare,parent,child).其中三個引數均為函式指標。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <assert.h>
#include <pthread.h>
pthread_mutex_t mutex;
void* fun(void *arg)
{
printf("fun will get mutex\n");
pthread_mutex_lock(&mutex);
printf("fun lock success\n");
sleep(5);
pthread_mutex_unlock(&mutex);
printf("fun unlock\n");
}
void prepare()
{
pthread_mutex_lock(&mutex);
}
void parent()
{
pthread_mutex_unlock(&mutex);
}
void child()
{
pthread_mutex_unlock(&mutex);
}
void main()
{
pthread_mutex_init(&mutex,NULL);
pthread_t th;
int res=pthread_create(&th,NULL,fun,NULL);
assert(res==0);
sleep(2);
pthread_atfork(prepare,parent,child);
pid_t pid=fork();
assert(pid!=-1);
if(pid==0)
{
printf("child will get mutex\n");
pthread_mutex_lock(&mutex);
printf("child lock success\n");
sleep(2);
pthread_mutex_unlock(&mutex);
printf("child unlock\n");
}
else
{
printf("father will get mutex\n");
pthread_mutex_lock(&mutex);
printf("father lock success\n");
sleep(2);
pthread_mutex_unlock(&mutex);
printf("father unlock\n");
}
}
列印結果:
fun will get mutex
fun lock success
fun unlock
father will get mutex
father lock success
child will get mutex
child lock success
father unlock
child unlock
相關文章
- 執行緒中的死鎖執行緒
- 【圖文】函式呼叫過程中棧的變化函式
- Qt 子執行緒呼叫connect/QMetaObject::invokeMethod 不呼叫槽函式問題QT執行緒Object函式
- 執行緒中的幾個退出相關函式執行緒函式
- 多執行緒常用函式執行緒函式
- Java多執行緒中執行緒安全與鎖問題Java執行緒
- 執行緒的互斥鎖執行緒
- 關於執行緒的幾個函式執行緒函式
- python中5種執行緒鎖Python執行緒
- Java多執行緒(2)執行緒鎖Java執行緒
- 執行緒安全與鎖最佳化執行緒
- c++ 執行緒函式傳遞資料 物件和變數C++執行緒函式物件變數
- 執行緒鎖(四)執行緒
- 多執行緒_鎖執行緒
- performSelector:withObject:afterDelay: 在子執行緒中呼叫不執行performSelectorObject執行緒
- 執行緒join為什麼在解構函式中執行緒函式
- Thread 中的 join() 方法的作用是呼叫執行緒等待該執行緒執行完後,再繼續執行thread執行緒
- .NET中各種執行緒同步鎖執行緒
- iOS多執行緒安全-13種執行緒鎖?iOS執行緒
- 多執行緒(2)-執行緒同步互斥鎖Mutex執行緒Mutex
- 執行緒和鎖,鎖升級執行緒
- C# 帶引數帶互鎖多執行緒呼叫方法C#執行緒
- java的執行緒、建立執行緒的 3 種方式、靜態代理模式、Lambda表示式簡化執行緒Java執行緒模式
- fork()與vfork()函式函式
- 執行緒建立的函式及應用小結執行緒函式
- python之執行緒鎖Python執行緒
- 【Swift】iOS 執行緒鎖SwiftiOS執行緒
- 關於linux多執行緒fork的理解和學習Linux執行緒
- 多執行緒安全性和Java中的鎖執行緒Java
- Java多執行緒程式設計—鎖優化Java執行緒程式設計優化
- 理解JVM(六):執行緒安全和鎖優化JVM執行緒優化
- iOS開發基礎——執行緒安全(執行緒鎖)iOS執行緒
- 跟著sleep看jvm執行緒變化JVM執行緒
- .Net7執行模型之託管Main函式的呼叫模型AI函式
- 理解 pcntl_fork 函式函式
- 研究linux函式 之 fork()Linux函式
- JAVA多執行緒詳解(3)執行緒同步和鎖Java執行緒
- ObjC 多執行緒簡析(一)-多執行緒簡述和執行緒鎖的基本應用OBJ執行緒
- 執行緒狀態和鎖執行緒