posix編程
三種專門用於線程同步的機制:POSIX信號量,互斥量和條件變數.
在Linux上信號量API有兩組,一組是System V IPC信號量,即PV操作,另外就是POSIX信號量,POSIX信號量的名字都是以sem_開頭.
phshared參數指定信號量的類型,若其值為0,就表示這個信號量是當前進程的局部信號量,否則該信號量可以在多個進程之間共享.value值指定信號量的初始值,一般與下面的sem_wait函數相對應.
其中比較重要的函數sem_wait函數會以原子操作的方式將信號量的值減一,如果信號量的值為零,則sem_wait將會阻塞,信號量的值可以在sem_init函數中的value初始化;sem_trywait函數是sem_wait的非阻塞版本;sem_post函數將以原子的操作對信號量加一,當信號量的值大於0時,其他正在調用sem_wait等待信號量的線程將被喚醒.
這些函數成功時返回0,失敗則返回-1並設置errno.
生產者消費者模型:
生產者對應一個信號量:sem_t procer;
消費者對應一個信號量:sem_t customer;
sem_init(&procer,2)----生產者擁有資源,可以工作;
sem_init(&customer,0)----消費者沒有資源,阻塞;
在訪問公共資源前對互斥量設置(加鎖),確保同一時間只有一個線程訪問數據,在訪問完成後再釋放(解鎖)互斥量.
互斥鎖的運行方式:串列訪問共享資源;
信號量的運行方式:並行訪問共享資源;
互斥量用pthread_mutex_t數據類型表示,在使用互斥量之前,必須使用pthread_mutex_init函數對它進行初始化,注意,使用完畢後需調用pthread_mutex_destroy.
pthread_mutex_init用於初始化互斥鎖,mutexattr用於指定互斥鎖的屬性,若為NULL,則表示默認屬性。除了用這個函數初始化互斥所外,還可以用如下方式初始化:pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER。
pthread_mutex_destroy用於銷毀互斥鎖,以釋放佔用的內核資源,銷毀一個已經加鎖的互斥鎖將導致不可預期的後果。
pthread_mutex_lock以原子操作給一個互斥鎖加鎖。如果目標互斥鎖已經被加鎖,則pthread_mutex_lock則被阻塞,直到該互斥鎖佔有者把它給解鎖.
pthread_mutex_trylock和pthread_mutex_lock類似,不過它始終立即返回,而不論被操作的互斥鎖是否加鎖,是pthread_mutex_lock的非阻塞版本.當目標互斥鎖未被加鎖時,pthread_mutex_trylock進行加鎖操作;否則將返回EBUSY錯誤碼。注意:這里討論的pthread_mutex_lock和pthread_mutex_trylock是針對普通鎖而言的,對於其他類型的鎖,這兩個加鎖函數會有不同的行為.
pthread_mutex_unlock以原子操作方式給一個互斥鎖進行解鎖操作。如果此時有其他線程正在等待這個互斥鎖,則這些線程中的一個將獲得它.
三個列印機輪流列印:
輸出結果:
如果說互斥鎖是用於同步線程對共享數據的訪問的話,那麼條件變數就是用於在線程之間同步共享數據的值.條件變數提供了一種線程之間通信的機制:當某個共享數據達到某個值時,喚醒等待這個共享數據的線程.
條件變數會在條件不滿足的情況下阻塞線程.且條件變數和互斥量一起使用,允許線程以無競爭的方式等待特定的條件發生.
其中pthread_cond_broadcast函數以廣播的形式喚醒所有等待目標條件變數的線程,pthread_cond_signal函數用於喚醒一個等待目標條件變數線程.但有時候我們可能需要喚醒一個固定的線程,可以通過間接的方法實現:定義一個能夠唯一標識目標線程的全局變數,在喚醒等待條件變數的線程前先設置該變數為目標線程,然後採用廣播的方式喚醒所有等待的線程,這些線程被喚醒之後都檢查該變數以判斷是否是自己.
採用條件變數+互斥鎖實現生產者消費者模型:
運行結果:
阻塞隊列+生產者消費者
運行結果:
⑵ 關於編程,c++語言.
關於 C++ 框架、庫和資源的一些匯總列表,內容包括:標准庫、Web應用框架、人工智慧、資料庫、圖片處理、機器學習、日誌、代碼分析等。有需要的小夥伴可以收藏一下! C++標准庫,包括了STL容器,演算法和函數等。 C++ Standard Library:是一系列類和函數的集合,使用核心語言編寫,也是C++ISO自身標準的一部分。 Standard Template Library:標准模板庫 C POSIX library : POSIX系統的C標准庫規范 ISO C++ Standards Committee :C++標准委員會
C++通用框架和庫 Apache C++ Standard Library:是一系列演算法,容器,迭代器和其他基本組件的集合 ASL :Adobe源代碼庫提供了同行的評審和可移植的C++源代碼庫磨悉晌。 Boost :大量通用C++庫的集合。 BDE :來自於彭博資訊實驗室的開發環境。 Cinder:提供專業品質創造性編碼的開源開發社區。 Cxxomfort:輕量級的,只包含頭文件的庫,將C++ 11的一些新特性移植到C++03中。 Dlib:使用契約式編程和現代C++ 科技 設計的通用的跨平台的C++庫。 EASTL :EA-STL公共部分 ffead-cpp :企業應用程序開發框架 Folly:由Facebook開發和使用的開源C++庫 JUCE :包羅萬象的C++類庫,用於開發跨平台軟體 libPhenom:用於構建高性能和高度可擴展性系統的事件框架。 LibSourcey :用於實時的視頻流和高性能網路應用程序的瞎鋒C++11 evented IO LibU : C語言寫的多平台工具庫 Loki :C++庫的設計,包括常見的設計模式和習語的實現。 MiLi :只含頭文件的小型C++庫 openFrameworks :開發C++工具包,用於創意性編碼。 Qt :跨平台的應用程序和用戶界面框架 Reason :跨平台的框架,使開發者能夠更容易地使用Java,.Net和Python,同時也滿足了他們對C++性能和優勢的需求。 ROOT :具備所有功能的一系列面向對象的框架,能夠非常高效地陸隱處理和分析大量的數據,為歐洲原子能研究機構所用。 STLport:是STL具有代表性的版本 STXXL:用於額外的大型數據集的標准模板庫。 Ultimate++ :C++跨平台快速應用程序開發框架 Windows Template Library:用於開發Windows應用程序和UI組件的C++庫 Yomm11 :C++11的開放multi-methods.
btsk : 游戲 行為樹啟動器工具 Evolving Objects:基於模板的,ANSI C++演化計算庫,能夠幫助你非常快速地編寫出自己的隨機優化演算法。 Neu:C++11框架,編程語言集,用於創建人工智慧應用程序的多用途軟體系統。
Boost.Asio:用於網路和底層I/O編程的跨平台的C++庫。 libev :功能齊全,高性能的時間循環,輕微地仿效libevent,但是不再像libevent一樣有局限性,也修復了它的一些bug。 libevent :事件通知庫 libuv :跨平台非同步I/O。
音頻,聲音,音樂,數字化音樂庫 FMOD :易於使用的跨平台的音頻引擎和音頻內容的 游戲 創作工具。 Maximilian :C++音頻和音樂數字信號處理庫 OpenAL :開源音頻庫—跨平台的音頻API Opus:一個完全開放的,免版稅的,高度通用的音頻編解碼器 Speex:免費編解碼器,為Opus所廢棄 Tonic: C++易用和高效的音頻合成 Vorbis: Ogg Vorbis是一種完全開放的,非專有的,免版稅的通用壓縮音頻格式。
生物信息,基因組學和生物技術 libsequence:用於表示和分析群體遺傳學數據的C++庫。 SeqAn:專注於生物數據序列分析的演算法和數據結構。 Vcflib :用於解析和處理VCF文件的C++庫 Wham:直接把聯想測試應用到BAM文件的基因結構變異。
壓縮和歸檔庫 bzip2:一個完全免費,免費專利和高質量的數據壓縮 doboz:能夠快速解壓縮的壓縮庫 PhysicsFS:對各種歸檔提供抽象訪問的庫,主要用於視頻 游戲 ,設計靈感部分來自於Quake3的文件子系統。 KArchive:用於創建,讀寫和操作文件檔案(例如zip和 tar)的庫,它通過QIODevice的一系列子類,使用gzip格式,提供了透明的壓縮和解壓縮的數據。 LZ4 :非常快速的壓縮演算法 LZHAM :無損壓縮資料庫,壓縮比率跟LZMA接近,但是解壓縮速度卻要快得多。 LZMA :7z格式默認和通用的壓縮方法。 LZMAT :及其快速的實時無損數據壓縮庫 miniz:單一的C源文件,緊縮/膨脹壓縮庫,使用zlib兼容API,ZIP歸檔讀寫,PNG寫方式。 Minizip:Zlib最新bug修復,支持PKWARE磁碟跨越,AES加密和IO緩沖。 Snappy :快速壓縮和解壓縮 ZLib :非常緊湊的數據流壓縮庫 ZZIPlib:提供ZIP歸檔的讀許可權。
並發執行和多線程 Boost.Compute :用於OpenCL的C++GPU計算庫 Bolt :針對GPU進行優化的C++模板庫 C++React :用於C++11的反應性編程庫 Intel TBB :Intel線程構件塊 Libclsph:基於OpenCL的GPU加速SPH流體模擬庫 OpenCL :並行編程的異構系統的開放標准 OpenMP:OpenMP API Thrust :類似於C++標准模板庫的並行演算法庫 HPX :用於任何規模的並行和分布式應用程序的通用C++運行時系統 VexCL :用於OpenCL/CUDA 的C++向量表達式模板庫。
C++ B-tree :基於B樹數據結構,實現命令內存容器的模板庫 Hashmaps: C++中開放定址哈希表演算法的實現
Bcrypt :一個跨平台的文件加密工具,加密文件可以移植到所有可支持的操作系統和處理器中。 BeeCrypt: Botan: C++加密庫 Crypto++:一個有關加密方案的免費的C++庫 GnuPG: OpenPGP標準的完整實現 GnuTLS :實現了SSL,TLS和DTLS協議的安全通信庫 Libgcrypt libmcrypt LibreSSL:免費的SSL/TLS協議,屬於2014 OpenSSL的一個分支 LibTomCrypt:一個非常全面的,模塊化的,可移植的加密工具 libsodium:基於NaCI的加密庫,固執己見,容易使用 Nettle 底層的加密庫 OpenSSL : 一個強大的,商用的,功能齊全的,開放源代碼的加密庫。 Tiny AES128 in C :用C實現的一個小巧,可移植的實現了AES128ESB的加密演算法
資料庫,SQL伺服器,ODBC驅動程序和工具 hiberlite :用於Sqlite3的C++對象關系映射 Hiredis: 用於Redis資料庫的很簡單的C客戶端庫 LevelDB: 快速鍵值存儲庫 LMDB:符合資料庫四大基本元素的嵌入鍵值存儲 MySQL++:封裝了MySql的C API的C++ 包裝器 RocksDB:來自Facebook的嵌入鍵值的快速存儲 SQLite:一個完全嵌入式的,功能齊全的關系資料庫,只有幾百KB,可以正確包含到你的項目中。
調試庫, 內存和資源泄露檢測,單元測試 Boost.Test:Boost測試庫 Catch:一個很 時尚 的,C++原生的框架,只包含頭文件,用於單元測試,測試驅動開發和行為驅動開發。 CppUnit:由JUnit移植過來的C++測試框架 CTest:CMake測試驅動程序 googletest:谷歌C++測試框架 ig-debugheap:用於跟蹤內存錯誤的多平台調試堆 libtap:用C語言編寫測試 MemTrack —用於C++跟蹤內存分配 microprofile- 跨平台的網路試圖分析器 minUnit :使用C寫的迷你單元測試框架,只使用了兩個宏 Remotery:用於web視圖的單一C文件分析器 UnitTest++:輕量級的C++單元測試框架
Cocos2d-x :一個跨平台框架,用於構建2D 游戲 ,互動圖書,演示和其他圖形應用程序。 Grit :社區項目,用於構建一個免費的 游戲 引擎,實現開放的世界3D 游戲 。 Irrlicht :C++語言編寫的開源高性能的實時#D引擎 Polycode:C++實現的用於創建 游戲 的開源框架(與Lua綁定)。
CEGUI : 很靈活的跨平台GUI庫 FLTK :快速,輕量級的跨平台的C++GUI工具包。 GTK+: 用於創建圖形用戶界面的跨平台工具包 gtkmm :用於受歡迎的GUI庫GTK+的官方C++介面。 imgui:擁有最小依賴關系的立即模式圖形用戶界面 libRocket :libRocket 是一個C++ HTML/CSS 游戲 介面中間件 MyGUI :快速,靈活,簡單的GUI Ncurses:終端用戶界面 QCustomPlot :沒有更多依賴關系的Qt繪圖控制項 Qwt :用戶與技術應用的Qt 控制項 QwtPlot3D :功能豐富的基於Qt/OpenGL的C++編程庫,本質上提供了一群3D控制項 OtterUI :OtterUI 是用於嵌入式系統和互動 娛樂 軟體的用戶界面開發解決方案 PDCurses 包含源代碼和預編譯庫的公共圖形函數庫 wxWidgets C++庫,允許開發人員使用一個代碼庫可以為widows, Mac OS X,Linux和其他平台創建應用程序
bgfx:跨平台的渲染庫 Cairo:支持多種輸出設備的2D圖形庫 Horde3D 一個小型的3D渲染和動畫引擎 magnum C++11和OpenGL 2D/3D 圖形引擎 Ogre 3D 用C++編寫的一個面向場景,實時,靈活的3D渲染引擎(並非 游戲 引擎) OpenSceneGraph 具有高性能的開源3D圖形工具包 Panda3D 用於3D渲染和 游戲 開發的框架,用Python和C++編寫。 Skia 用於繪制文字,圖形和圖像的完整的2D圖形庫 urho3d 跨平台的渲染和 游戲 引擎。
Boost.GIL:通用圖像庫 CImg :用於圖像處理的小型開源C++工具包 CxImage :用於載入,保存,顯示和轉換的圖像處理和轉換庫,可以處理的圖片格式包括 BMP, JPEG, GIF, PNG, TIFF, MNG, ICO, PCX, TGA, WMF, WBMP, JBG, J2K。 FreeImage :開源庫,支持現在多媒體應用所需的通用圖片格式和其他格式。 GDCM:Grassroots DICOM 庫 ITK:跨平台的開源圖像分析系統 Magick++:ImageMagick程序的C++介面 MagickWnd:ImageMagick程序的C++介面 OpenCV : 開源計算機視覺類庫 tesseract-ocr:OCR引擎 VIGRA :用於圖像分析通用C++計算機視覺庫 VTK :用於3D計算機圖形學,圖像處理和可視化的開源免費軟體系統。 最後, 對於學習編程或者在工作想升職的程序員兄弟,如果你想更好的提升你的編程能力幫助你提升水平! 筆者這里或許可以幫到你~ 編程學習書籍分享: 編程學習視頻分享: 分享(源碼、項目實戰視頻、項目筆記,基礎入門教程) 歡迎轉行和學習編程的夥伴,利用更多的資料學習成長比自己琢磨更快哦!
⑶ Linux POSIX編程如何查詢指定的線程是否阻塞
使用線程間通信,在才確定的代碼位置使用mutex就可以完成你所要的功能。
線程互斥
互斥意味著「排它」,即兩個線程不能同時進入被互斥保護的代碼。Linux下可以通過pthread_mutex_t 定義互斥體機制完成多線程的互斥操作,該機制的作用是對某個需要互斥的部分,在進入時先得到互斥體,如果沒有得到互斥體,表明互斥部分被其它線程擁有,此時欲獲取互斥體的線程阻塞,直到擁有該互斥體的線程完成互斥部分的操作為止。
下面的代碼實現了對共享全局變數x 用互斥體mutex 進行保護的目的:
int x; // 進程中的全局變數
pthread_mutex_t mutex;
pthread_mutex_init(&mutex, NULL); //按預設的屬性初始化互斥體變數mutex
pthread_mutex_lock(&mutex); // 給互斥體變數加鎖
… //對變數x 的操作
phtread_mutex_unlock(&mutex); // 給互斥體變數解除鎖
線程同步
同步就是線程等待某個事件的發生。只有當等待的事件發生線程才繼續執行,否則線程掛起並放棄處理器。當多個線程協作時,相互作用的任務必須在一定的條件下同步。
Linux下的C語言編程有多種線程同步機制,最典型的是條件變數(condition variable)。pthread_cond_init用來創建一個條件變數,其函數原型為:
pthread_cond_init (pthread_cond_t *cond, const pthread_condattr_t *attr);
pthread_cond_wait和pthread_cond_timedwait用來等待條件變數被設置,值得注意的是這兩個等待調用需要一個已經上鎖的互斥體mutex,這是為了防止在真正進入等待狀態之前別的線程有可能設置該條件變數而產生競爭。pthread_cond_wait的函數原型為:
pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex);
pthread_cond_broadcast用於設置條件變數,即使得事件發生,這樣等待該事件的線程將不再阻塞:
pthread_cond_broadcast (pthread_cond_t *cond) ;
pthread_cond_signal則用於解除某一個等待線程的阻塞狀態:
pthread_cond_signal (pthread_cond_t *cond) ;
pthread_cond_destroy 則用於釋放一個條件變數的資源。
在頭文件semaphore.h 中定義的信號量則完成了互斥體和條件變數的封裝,按照多線程程序設計中訪問控制機制,控制對資源的同步訪問,提供程序設計人員更方便的調用介面。
sem_init(sem_t *sem, int pshared, unsigned int val);
這個函數初始化一個信號量sem 的值為val,參數pshared 是共享屬性控制,表明是否在進程間共享。
sem_wait(sem_t *sem);
調用該函數時,若sem為無狀態,調用線程阻塞,等待信號量sem值增加(post )成為有信號狀態;若sem為有狀態,調用線程順序執行,但信號量的值減一。
sem_post(sem_t *sem);
調用該函數,信號量sem的值增加,可以從無信號狀態變為有信號狀態。
⑷ 安卓和ios編程需要什麼語言
1、安卓編程需要linux語言
Linux是一套免費使用和自由傳播的類Unix操作系統,是一個基於POSIX和Unix的多用戶、多任務、支持多線程和多CPU的操作系統。伴隨著互聯網的發展,Linux得到了來自全世界軟體愛好者、組織、公司的支持。
它除了在伺服器操作系統方面保持著強勁的發展勢頭以外,在個人電腦、嵌入式系統上都有著長足的進步。使用者不僅可以直觀地獲取該操作系統的實現機制,而且可以根據自身的需要來修改完善這個操作系統,使其最大化地適應用戶的需要。
Linux不僅系統性能穩定,而且是開源軟體。其核心防火牆組件性能高效、配置簡單,保證了系統的安全。
在很多企業網路中,為了追求速度和安全,Linux操作系統不僅僅是被網路運維人員當作伺服器使用,Linux既可以當作伺服器,又可以當作網路防火牆是Linux的 一大亮點。
Linux與其他操作系統相比 ,具有開放源碼、沒有版權、技術社區用戶多等特點 ,開放源碼使得用戶可以自由裁剪,靈活性高,功能強大,成本低。尤其系統中內嵌網路協議棧 ,經過適當的配置就可實現路由器的功能。這些特點使得Linux成為開發路由交換設備的理想開發平台。
2、ios編程需要MacOS語言
Mac OS是一套運行於蘋果Macintosh系列電腦上的操作系統。
Mac OS是首個在商用領域成功的圖形用戶界面操作系統。現行的最新的系統版本是macOS 10.15 beta 4 ,且網上也有在PC上運行的Mac系統(Hackintosh)。
Mac系統是基於Unix內核的圖形化操作系統;一般情況下在普通PC上無法安裝的操作系統。
由蘋果自行開發。蘋果機的操作系統已經到了OS 10,代號為Mac OS X(X為10的羅馬數字寫法),這是MAC電腦誕生15年來最大的變化。新系統非常可靠;它的許多特點和服務都體現了蘋果的理念。
另外,瘋狂肆虐的電腦病毒幾乎都是針對Windows的,由於MAC的架構與Windows不同,所以很少受到病毒的襲擊。macOS操作系統界面非常獨特,突出了形象的圖標和人機對話。蘋果不僅自己開發系統,也涉及到硬體的開發。
2011年7月20日Mac OS X已經正式被蘋果改名為OSX。2016年,OS X改名為macOS,與iOS,tvOS,watchOS相照應。
最新版本為macOS 10.14.6(Mojave),2019年5月14日凌晨發布。
2018年3月30日,蘋果推送了macOS High Sierra 10.13.4正式版,新版本增強了對外接eGPU的支持,還新增了此前iMac Pro專屬的墨水雲牆紙。
2018年9月25日,蘋果推送macOS Mojave 10.14,增加了深色模式,更新了Safari瀏覽器,Mac App Store,訪達,桌面,股市,語音備忘錄,家庭App等。
北京時間2019年6月4日凌晨1點,2019年WWDC全球開發者大會上蘋果發布macOS Catalina 10.15,用戶能將iPad用作Mac電腦的第二塊顯示屏,可以實現語音控制。
(4)posix編程擴展閱讀:
linux語言主要特性:
基本思想
Linux的基本思想有兩點:第一,一切都是文件;第二,每個軟體都有確定的用途。
其中第一條詳細來講就是系統中的所有都歸結為一個文件,包括命令、硬體和軟體設備、操作系統、進程等等對於操作系統內核而言,都被視為擁有各自特性或類型的文件。至於說Linux是基於Unix的,很大程度上也是因為這兩者的基本思想十分相近。
完全免費
Linux是一款免費的操作系統,用戶可以通過網路或其他途徑免費獲得,並可以任意修改其源代碼。這是其他的操作系統所做不到的。
正是由於這一點,來自全世界的無數程序員參與了Linux的修改、編寫工作,程序員可以根據自己的興趣和靈感對其進行改變,這讓Linux吸收了無數程序員的精華,不斷壯大。
完全兼容POSIX1.0標准
這使得可以在Linux下通過相應的模擬器運行常見的DOS、Windows的程序。這為用戶從Windows轉到Linux奠定了基礎。許多用戶在考慮使用Linux時,就想到以前在Windows下常見的程序是否能正常運行,這一點就消除了他們的疑慮。
多用戶、多任務
Linux支持多用戶,各個用戶對於自己的文件設備有自己特殊的權利,保證了各用戶之間互不影響。多任務則是現在電腦最主要的一個特點,Linux可以使多個程序同時並獨立地運行。
良好的界面
Linux同時具有字元界面和圖形界面。在字元界面用戶可以通過鍵盤輸入相應的指令來進行操作。它同時也提供了類似Windows圖形界面的X-Window系統,用戶可以使用滑鼠對其進行操作。
在X-Window環境中就和在Windows中相似,可以說是一個Linux版的Windows。
支持多種平台
Linux可以運行在多種硬體平台上,如具有x86、680x0、SPARC、Alpha等處理器的平台。此外Linux還是一種嵌入式操作系統,可以運行在掌上電腦、機頂盒或游戲機上。
2001年1月份發布的Linux 2.4版內核已經能夠完全支持Intel64位晶元架構。同時Linux也支持多處理器技術。多個處理器同時工作,使系統性能大大提高。