腳本加互斥鎖
⑴ 互斥鎖的設置協議
pthread_mutexattr_setprotocol(3C)可用來設置互斥鎖屬性對象的協議屬性。
pthread_mutexattr_setprotocol 語法
#include <pthread.h>int pthread_mutexattr_setprotocol(pthread_mutexattr_t *attr, int protocol);attr 指示以前調用pthread_mutexattr_init()時創建的互斥鎖屬性對象。
protocol 可定義應用於互斥鎖屬性對象的協議。
pthread.h 中定義的 protocol 可以是以下值之一:PTHREAD_PRIO_NONE、PTHREAD_PRIO_INHERIT 或 PTHREAD_PRIO_PROTECT。
PTHREAD_PRIO_NONE
線程的優先順序和調度不會受到互斥鎖擁有權的影響。
PTHREAD_PRIO_INHERIT
此協議值(如 thrd1)會影響線程的優先順序和調度。如果更高優先順序的線程因 thrd1 所擁有的一個或多個互斥鎖而被阻塞,而這些互斥鎖是用 PTHREAD_PRIO_INHERIT 初始化的,則 thrd1 將以高於它的優先順序或者所有正在等待這些互斥鎖(這些互斥鎖是 thrd1 指所擁有的互斥鎖)的線程的最高優先順序運行。
如果 thrd1 因另一個線程 (thrd3) 擁有的互斥鎖而被阻塞,則相同的優先順序繼承效應會以遞歸方式傳播給 thrd3。
使用 PTHREAD_PRIO_INHERIT 可以避免優先順序倒置。低優先順序的線程持有較高優先順序線程所需的鎖時,便會發生優先順序倒置。只有在較低優先順序的線程釋放該鎖之後,較高優先順序的線程才能繼續使用該鎖。設置 PTHREAD_PRIO_INHERIT,以便按與預期的優先順序相反的優先順序處理每個線程。
如果為使用協議屬性值 PTHREAD_PRIO_INHERIT 初始化的互斥鎖定義了 _POSIX_THREAD_PRIO_INHERIT,則互斥鎖的屬主失敗時會執行以下操作。屬主失敗時的行為取決於pthread_mutexattr_setrobust_np()的 robustness 參數的值。
解除鎖定互斥鎖。
互斥鎖的下一個屬主將獲取該互斥鎖,並返回錯誤 EOWNERDEAD。
互斥鎖的下一個屬主會嘗試使該互斥鎖所保護的狀態一致。如果上一個屬主失敗,則狀態可能會不一致。如果屬主成功使狀態保持一致,則可針對該互斥鎖調用pthread_mutex_init()並解除鎖定該互斥鎖。
注 –如果針對以前初始化的但尚未銷毀的互斥鎖調用pthread_mutex_init(),則該互斥鎖不會重新初始化。
如果屬主無法使狀態保持一致,請勿調用pthread_mutex_init(),而是解除鎖定該互斥鎖。在這種情況下,所有等待的線程都將被喚醒。以後對pthread_mutex_lock()的所有調用將無法獲取互斥鎖,並將返回錯誤代碼 ENOTRECOVERABLE。現在,通過調用pthread_mutex_destroy()來取消初始化該互斥鎖,即可使其狀態保持一致。調用pthread_mutex_init()可重新初始化互斥鎖。
如果已獲取該鎖的線程失敗並返回 EOWNERDEAD,則下一個屬主將獲取該鎖及錯誤代碼 EOWNERDEAD。
PTHREAD_PRIO_PROTECT
當線程擁有一個或多個使用 PTHREAD_PRIO_PROTECT 初始化的互斥鎖時,此協議值會影響其他線程(如 thrd2)的優先順序和調度。thrd2 以其較高的優先順序或者以 thrd2 擁有的所有互斥鎖的最高優先順序上限運行。基於被 thrd2 擁有的任一互斥鎖阻塞的較高優先順序線程對於 thrd2 的調度沒有任何影響。
如果某個線程調用sched_setparam()來更改初始優先順序,則調度程序不會採用新優先順序將該線程移到調度隊列末尾。
線程擁有使用 PTHREAD_PRIO_INHERIT 或 PTHREAD_PRIO_PROTECT 初始化的互斥鎖
線程解除鎖定使用 PTHREAD_PRIO_INHERIT 或 PTHREAD_PRIO_PROTECT 初始化的互斥鎖
一個線程可以同時擁有多個混合使用 PTHREAD_PRIO_INHERIT 和 PTHREAD_PRIO_PROTECT 初始化的互斥鎖。在這種情況下,該線程將以通過其中任一協議獲取的最高優先順序執行。
pthread_mutexattr_setprotocol 返回值
如果成功完成,pthread_mutexattr_setprotocol()會返回 0。其他任何返回值都表示出現了錯誤。
如果出現以下任一情況,pthread_mutexattr_setprotocol()將失敗並返回對應的值。
ENOSYS
描述:選項 _POSIX_THREAD_PRIO_INHERIT 和 _POSIX_THREAD_PRIO_PROTECT 均未定義並且該實現不支持此函數。
ENOTSUP
描述:protocol 指定的值不受支持。
如果出現以下任一情況,pthread_mutexattr_setprotocol()可能會失敗並返回對應的值。
EINVAL
描述:attr 或 protocol 指定的值無效。
EPERM
描述:調用方無權執行該操作。

⑵ VC++中一個關於lua腳本文件的方法lua_isstring,它是干什麼用的,我有一段代碼總在這里出錯
lua_isstring 是檢測堆棧指定位置的值是否為字元串類型,看邏輯一般不會有錯。不過看你說到多個線程調用到這里,個人猜測是你在線程中使用了同一個lua_State而沒有採取互斥措施。你把線程中調用lua的地方加個互斥鎖試試。
⑶ linux線程同步的互斥鎖(mutex)到底怎麼用的》謝謝
互斥鎖(mutex) 通過鎖機制實現線程間的同步。
1、初始化鎖。在Linux下,線程的互斥量數據類型是pthread_mutex_t。在使用前,要對它進行初始化。
2、靜態分配:pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
3、動態分配:int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutex_attr_t *mutexattr);
4、加鎖。對共享資源的訪問,要對互斥量進行加鎖,如果互斥量已經上了鎖,調用線程會阻塞,直到互斥量被解鎖。
intpthread_mutex_lock(pthread_mutex*mutex);
intpthread_mutex_trylock(pthread_mutex_t*mutex);
解鎖。在完成了對共享資源的訪問後,要對互斥量進行解鎖。
intpthread_mutex_unlock(pthread_mutex_t*mutex);
銷毀鎖。鎖在是使用完成後,需要進行銷毀以釋放資源。
intpthread_mutex_destroy(pthread_mutex*mutex);
#include<cstdio>
#include<cstdlib>
#include<unistd.h>
#include<pthread.h>
#include"iostream"
usingnamespacestd;
pthread_mutex_tmutex=PTHREAD_MUTEX_INITIALIZER;
inttmp;
void*thread(void*arg)
{
cout<<"threadidis"<<pthread_self()<<endl;
pthread_mutex_lock(&mutex);
tmp=12;
cout<<"Nowais"<<tmp<<endl;
pthread_mutex_unlock(&mutex);
returnNULL;
}
intmain()
{
pthread_tid;
cout<<"mainthreadidis"<<pthread_self()<<endl;
tmp=3;
cout<<"Inmainfunctmp="<<tmp<<endl;
if(!pthread_create(&id,NULL,thread,NULL))
{
cout<<"Createthreadsuccess!"<<endl;
}
else
{
cout<<"Createthreadfailed!"<<endl;
}
pthread_join(id,NULL);
pthread_mutex_destroy(&mutex);
return0;
}
//編譯:g++-othreadtestthread.cpp-lpthread
⑷ java哪個關鍵字可以對對象加互斥鎖
Java語言的關鍵字,可用來給對象和方法或者代碼塊加鎖,當它鎖定一個方法或者一個代碼塊的時候,同一時刻最多隻有一個線程執行這段代碼。
互斥屬性:即每次只能有一個線程佔用資源。
請求與保持:即已經申請到鎖資源的線程可以繼續申請。在這種情況下,一個線程也可以產生死鎖情況,即抱著鎖找鎖。
不可剝奪:線程已經得到所資源,在沒有自己主動釋放之前,不能被強行剝奪。
循環等待:多個線程形成環路等待,每個線程都在等待相鄰線程的鎖資源。
⑸ linux下互斥鎖mutex,貌似鎖不上呢
多線程的效果就是同一時間各個線程都在執行。
加鎖不是給線程上鎖。
pthread_mutex_lock(&qlock);表示嘗試去把qlock上鎖,它會先判斷qlock是否已經上鎖,如果已經上鎖這個線程就會停在這一步直到其他線程把鎖解開。它才繼續運行。
所以代碼中要麼是線程1先執行完後執行線程2,要麼就是線程2先執行,再執行線程1.而線程3一開始就執行了。
互斥量mutex是用來給多線程之間的貢獻資源上鎖的。也就是同一個時間只允許一個線程去訪問該資源(資源:比如對文件的寫操作)。
現在來回答樓主的問題:
不是只要在pthread_mutex_lock(&qlock)與pthread_mutex_unlock(&qlock)之間的代碼執行,其他的都不能介入嗎?
其他的都不能介入,不是整個進程只運行這一個線程,其他線程都停住了。
「不能介入「這個動作需要程序員自己設計來保證:好比前面提到的文件讀寫操作。為了防止多個線程同時對文件進行寫入操作,這就需要把資源上鎖了。
如果只有線程1加鎖,那是不是這個鎖就沒有意義了呢?
這個理解可以有
⑹ python開發EA外匯交易怎麼開發
1.首先,你要有一個EA,必須要有以ex4為擴展名的,如果只有mq4文件的話,就要用MetaTrader自帶的編輯器MetaEditor打開,將mq4通過編譯(compile)並且要不出現錯誤,才能在原存放mq4的文件夾下面得到一個同名的ex4文件。
2.將這個ex4文件復制到MetaTrader 4所在的文件夾下面的experts文件夾下,比如:D:Program FilesACTC MetaTrader 4experts,關閉並重新打開MetaTrader 4。
3.在「導航」下面的「智能交易系統」下面右鍵點擊你想要使用的EA。
拓展資料:
1、 對於想要在 mt5+python 發展 ea 的交易者,最大會立即遇到的困難是,mt5 現在還沒有提供 python 可以調用 mt5 backtest 的介面,也就是在 python 上開發 ea 是無法在 mt5 上作復盤測試的,只能另外再找 python 的第三方 backtest 庫再多寫介面來達成。 復盤不是只有驗證策略的有效性,也扮演調試策略參數的重要工作,所以復盤對於開發 ea 是相當重要的環節。
2、另外在執行速度上,mt5+python ea 的速度自然是無法和純在 mt5 開發的 ea 相比,這個是實際執行壓力測試後得到的結論。因為 mt5+python ea 在調用當前價格和 K 線數據作為信號計算,和調用交易記錄,需要透過 mt5 python 官方庫與 mt5 建立在本地的一個加密的 socket 連接來作,讀寫速度自然是比不過 mt5 ea 直接從 mt5 內存讀取行情數據和訂單信息。雖然 python 是腳本編程語言,與其他編譯型的編程語言程序比自然是不快,但是對於 ea 的應用,這樣的慢是不太感受的到,可以直接感受到與相同 mt5 ea 的慢,主要是慢在與 mt5 間的大量數據傳送和 io 讀寫差異上,尤其是連續調用行情數據比較多時,這樣的速度差異就相當明顯了。
3、這還是有優化方式的,可以仿 mql5 指標對於初始和後續的行情讀取,採取精簡量的讀取方式。 既然有這些缺點,在 mt5 開發 python ea 還是在有些領域有不可替代的優點,所以 metaquotes 才會在 2020 年最終還是把 python 介面和函數庫提供出來。因為現在許多衍生性交易平台都已經具備了 python api,而經過這些年,python 已經成為量化交易程序最有人氣的編程語言,這也讓許多交易團隊在建構量化交易的環境,會優先考慮 python。 另外在人工智慧的量化交易,python 的機器學習和統計數組處理的第三方庫大概是最豐富的編程語言。對於交易策略里有用到 tensorflow 這類機器學習庫,使用 python 來開發自動交易程序是最佳的選擇。 mt5 或是 mt4 ea 受限於當時 metaquotes 自定的限制,只能作單線程運行,當同時觸發事件函數如 OnTimer OnTick OnChartEvent,mt5 底層會作互斥鎖限制一個線程運行。
操作環境: 瀏覽器 電腦端:macbookpro mos14打開goole版本 92.0.4515.131
⑺ C語言互斥鎖的問題
控制台。。。還是叫終端比較好吧。幫你解決問題,首先就是父子進程通信問題,可以用文件,管道,或者socket等等,注意自己要寫互斥,或加鎖。然後就是關掉進程的標准輸出了。代碼還是要你自己寫~
⑻ PHP下有沒有互斥鎖的實現方案
木有...至於鎖的方案一般由資源自己實現。比如對資料庫和緩存的訪問。PHP進程都是單線程模型,如果資源不可讀寫,則阻塞。不過PHP有文件鎖的機制,這貌似是PHP唯一支持的鎖...
⑼ 如果兩個函數加上互斥鎖其中一個正在運行另一個能被調用成功嗎
看你是什麼互斥邏輯。
如果是等待鎖被釋放,那麼可以被調用成功。不過裡面的代碼不會同時執行:
其中一個正在運行,那麼調用另一個的時候,會先等正在運行的執行完畢,才開始執行另一個
⑽ 9.哪個關鍵字可以對對象加互斥鎖
9.答案:B
A:關鍵字transient修飾的屬性將不被串列化
C:對象串列化
D:靜態的(類方法)
10.D,
java虛擬機負責回收內存
