日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

linux C 线程异常退出调查(linux c 线程)

發布時間:2023/12/3 综合教程 28 生活家
生活随笔 收集整理的這篇文章主要介紹了 linux C 线程异常退出调查(linux c 线程) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Exception in thread "main" 解決辦法?

Java命令行執行的時候,會出這樣的出錯信息Exception in thread main java. lang. NoclasSdeffounderror:應該這樣檢查你的環境和你的操作:

1、你的文件名對嗎?JAVA要求你的文件和你的類名嚴格對應的。比如 public class Helloword{..-那么文件名一定只能是 Helloworld. java,看仔細了!

2、你的程序中有main方法馬?參數什么的對嗎?main方法的聲明應該是這樣子的: public static Void main( Stringl們args)事實上如果你用開發工具來做的話,是不會錯的。如果你用 Ultraedit<之類的來寫程序的話,就一個字不要改的照抄吧!

3、記住, Javac后面跟的參數是文件名,但java后面跟的是類名!這是我開始學JAVA是犯的錯, java Helloworld, class,然后就報錯。后來才弄明白,應該是 ava Helloworld。

4、設置了 classpath了嗎?不僅是在安裝JDK時要設置的內容,一般來說最好還要自己設置一個目錄來存放自己的類文件的。比如d:Nclass E目錄。設置 classpath=% classpath%;dclass-那么,現在將 Helloworlc. class文件COPY到d: class E目錄下,再 java Hello World應該就OK了。

5、結合第3點和第4點如果你的類是屬于某一個包的,比如這樣一個類sony. test. Helloworld,那么按照我在第4點中說的目錄來說,就應該Helloworld, class文件存放到d: classsonytest目錄下。

執行的時候應該參考第3點中說的,按類名執行: java sony test, Hello World。明白了嗎?一直我也想不出還會有什么理由造成這個出錯信息了!如果有哪位兄弟想到了就補充一下吧!其實如果你使用了一些比較好的編程工具的話,根本就沒有機會碰到這個錯誤的,至少我在使用了 Visual/ Age for Java之后,就沒有這樣的事情了。好啦,不說了祝同志們好運吧!過了這第一道門,后面的就比較簡單啦。

Linux多線程通信?

PIPE和FIFO用來實現進程間相互發送非常短小的、頻率很高的消息;

這兩種方式通常適用于兩個進程間的通信。

共享內存用來實現進程間共享的、非常龐大的、讀寫操作頻率很高的數據(配合信號量使用);

這種方式通常適用于多進程間通信。

其他考慮用socket。這里的“其他情況”,其實是今天主要會碰到的情況:

分布式開發。

在多進程、多線程、多模塊所構成的今天最常見的分布式系統開發中,

socket是第一選擇

消息隊列,現在建議不要使用了 ---- 因為找不到使用它們的理由。

在實際中,我個人感覺,PIPE和FIFO可以偶爾使用下,共享內存都用的不多了。在效率上說,socket有包裝數據和解包數據的過程,所以理論上來說socket是沒有PIPE/FIFO快,不過現在計算機上真心不計較這么一點點速度損失的。你費勁糾結半天,不如我把socket設計好了,多插一塊CPU來得更劃算。
另外,進程間通信的數據一般來說我們都會存入數據庫的,這樣萬一某個進程突然死掉或者整個服務器死了,也不至于丟失重要數據、便于回滾到之前的狀態。從這個角度考慮,適用共享內存的情況也更少了,所以socket使用得更多。

再多說一點關于共享內存的:共享內存的效率確實高,但它的重點在“共享”二字上。如果的確有好些進程共享一大塊數據(如果把每個進程都看做是類的對象的話,那么共享數據就是這個類的static數據成員),那么共享內存就是一個不二的選擇了。但是在面向對象的今天,我們更多的時候是多線程+鎖+線程間共享數據。因此共享進程在今天使用的也越來越少了。
不過,在面對一些極度追求效率的需求時,共享內存就會成為唯一的選擇,比如高頻交易系統。除此以外,一般是不需要特意使用共享內存的。

另外,

PIPE和共享內存是不能跨LAN的

(FIFO可以但FIFO只能用于兩個進程通信)

如果你的分布式系統隨著需求的增加而越來越大所以你想把不同的模塊放在不同機器上而你之前開發的時候用了PIPE或者共享內存,那么你將不得不對代碼進行大幅修改......同時,即使FIFO可以跨越LAN,其代碼的可讀性、易操作性和可移植性、適應性也遠沒有socket大。這也就是為什么一開始說socket是第一選擇的原因。

最后還有個信號簡單說一下。

請注意,是信號,不是信號量。

信號量是用于同步線程間的對象的使用的(建議題主看我的答案,自認為比較通俗易懂:

semaphore和mutex的區別? - Linux - 知乎

)。
信號也是進程間通信的一種方式。比如在Linux系統下,一個進程正在執行時,你用鍵盤按Ctrl+c,就是給這個進程發送了一個信號。進程在捕捉到這個信號后會做相應的動作。
雖然信號是可以自定義的,但這并不能改變信號的局限性:

不能跨LAN、信息量極其有限


在現代的分布式系統中,通常都是

消息驅動:

即進程受到某個消息后,通過對消息的內容的分析然后做相應的動作。如果你把你的分布式系統設置成信號驅動的,這就表示你收到一個信號就要做一個動作而一個信號的本質其實就是一個數字而已。這樣系統稍微大一點的話,系統將變得異常難以維護;甚至在很多時候,信號驅動是無法滿足我們的需求的。
因此現在我們一般也不用信號了。

因此,請記住:

除非你有非常有說服力的理由,否則請用socket。

順便給你推薦個基于socket的輕量級的消息庫:ZeroMQ。

linux怎么指定線程庫?

大概的介紹一下Linux 的指定CPU運行,包括進程和線程。linux下的top命令是可以查看當前的cpu的運行狀態,按1可以查看系統有多少個CPU,以及每個CPU的運行狀態。 可是如何查看線程的CPU呢?

top -Hp pid,pid就是你當前程序的進程號,如果是多線程的話,是可以查看進程內所有線程的CPU和內存使用情況。

pstree可以查看主次線程,同樣的pstree -p pid。可以查看進程的線程情況。

taskset這個其實才是重點,可以查看以及設置當前進程或線程運行的CPU(設置親和力)。

taskset -pc pid,查看當前進程的cpu,當然有的時候不只是一個,taskset -pc cpu_num pid ,cpu_num就是設置的cpu。 這樣的話基本的命令和操作其實大家都知道了,接下來就是在代碼中完成這些操作,并通過命令去驗證代碼的成功率。 進程制定CPU運行:

view plain copy #include #include #include #include #include #define __USE_GNU #include #include #include int main(int argc, char* argv) { //sysconf獲取有幾個CPU int num = sysconf(_SC_NPROCESSORS_CONF); int created_thread = 0; int myid; int i; int j = 0; //原理其實很簡單,就是通過cpu_set_t進行位與操作 cpu_set_t mask; cpu_set_t get; if (argc != 2) { printf("usage : ./cpu numn"); exit(1); } myid = atoi(argv)

; printf("system has %i processor(s). n", num)

; //先進行清空,然后設置掩碼 CPU_ZERO(&mask); CPU_SET(myid, &mask)

; //設置進程的親和力 if (sched_setaffinity(0, sizeof(mask), &mask) == -1) { printf("warning: could not set CPU affinity, continuing...n"); } while (1) { CPU_ZERO(&get); //獲取當前進程的親和力 if (sched_getaffinity(0, sizeof(get), &get) == -1) { printf("warning: cound not get cpu affinity, continuing...n"); } for (i = 0; i < num; i++) { if (CPU_ISSET(i, &get)) { printf("this process %d is running processor : %dn",getpid(), i); } } } return 0; } 進程設置CPU運行,其實只能是單線程。多線程設定CPU如下:

view plain copy #define _GNU_SOURCE #include #include #include #include #include #include void *myfun(void *arg) { cpu_set_t mask; cpu_set_t get; char buf; int i; int j; //同樣的先去獲取CPU的個數 int num = sysconf(_SC_NPROCESSORS_CONF); printf("system has %d processor(s)n", num); for (i = 0; i < num; i++) { CPU_ZERO(&mask); CPU_SET(i, &mask); //這個其實和設置進程的親和力基本是一樣的 if (pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) < 0) { fprintf(stderr, "set thread affinity failedn"); } CPU_ZERO(&get); if (pthread_getaffinity_np(pthread_self(), sizeof(get), &get) < 0) { fprintf(stderr, "get thread affinity failedn"); } for (j = 0; j < num; j++) { if (CPU_ISSET(j, &get)) { printf("thread %d is running in processor %dn", (int)pthread_self(), j); } } j = 0; while (j++ < 100000000) { memset(buf, 0, sizeof(buf)); } } pthread_exit(NULL); } int main(int argc, char *argv) { pthread_t tid; if (pthread_create(&tid, NULL, (void *)myfun, NULL) != 0) { fprintf(stderr, "thread create failedn"); return -1; } pthread_join(tid, NULL); return 0; }

linux有沒有線程id確認函數?

linux C中,獲取當前進程id 函數為getpid() ;
頭文件:#include?

函數原型:pid_t?getpid(void);

函數說明:getpid?()用來取得目前進程的進程id,許多程序利用取到的此值來建立臨時文件,?以避免臨時文件相同帶來的問題。

返回值:目前進程的進程id

范例
#include?
#include?
main()
{
????printf("pid=%dn",?getpid());
}

執行:
pid=1494?/*每次執行結果都不一定相同?*/

總結

以上是生活随笔為你收集整理的linux C 线程异常退出调查(linux c 线程)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。