linux C 线程异常退出调查(linux c 线程)
Exception in thread "main" 解決辦法?
Java命令行執(zhí)行的時候,會出這樣的出錯信息Exception in thread main java. lang. NoclasSdeffounderror:應(yīng)該這樣檢查你的環(huán)境和你的操作:
1、你的文件名對嗎?JAVA要求你的文件和你的類名嚴(yán)格對應(yīng)的。比如 public class Helloword{..-那么文件名一定只能是 Helloworld. java,看仔細(xì)了!
2、你的程序中有main方法馬?參數(shù)什么的對嗎?main方法的聲明應(yīng)該是這樣子的: public static Void main( Stringl們args)事實上如果你用開發(fā)工具來做的話,是不會錯的。如果你用 Ultraedit<之類的來寫程序的話,就一個字不要改的照抄吧!
3、記住, Javac后面跟的參數(shù)是文件名,但java后面跟的是類名!這是我開始學(xué)JAVA是犯的錯, java Helloworld, class,然后就報錯。后來才弄明白,應(yīng)該是 ava Helloworld。
4、設(shè)置了 classpath了嗎?不僅是在安裝JDK時要設(shè)置的內(nèi)容,一般來說最好還要自己設(shè)置一個目錄來存放自己的類文件的。比如d:Nclass E目錄。設(shè)置 classpath=% classpath%;dclass-那么,現(xiàn)在將 Helloworlc. class文件COPY到d: class E目錄下,再 java Hello World應(yīng)該就OK了。
5、結(jié)合第3點和第4點如果你的類是屬于某一個包的,比如這樣一個類sony. test. Helloworld,那么按照我在第4點中說的目錄來說,就應(yīng)該Helloworld, class文件存放到d: classsonytest目錄下。
執(zhí)行的時候應(yīng)該參考第3點中說的,按類名執(zhí)行: java sony test, Hello World。明白了嗎?一直我也想不出還會有什么理由造成這個出錯信息了!如果有哪位兄弟想到了就補充一下吧!其實如果你使用了一些比較好的編程工具的話,根本就沒有機會碰到這個錯誤的,至少我在使用了 Visual/ Age for Java之后,就沒有這樣的事情了。好啦,不說了祝同志們好運吧!過了這第一道門,后面的就比較簡單啦。
Linux多線程通信?
PIPE和FIFO用來實現(xiàn)進(jìn)程間相互發(fā)送非常短小的、頻率很高的消息;
這兩種方式通常適用于兩個進(jìn)程間的通信。
共享內(nèi)存用來實現(xiàn)進(jìn)程間共享的、非常龐大的、讀寫操作頻率很高的數(shù)據(jù)(配合信號量使用);
這種方式通常適用于多進(jìn)程間通信。
其他考慮用socket。這里的“其他情況”,其實是今天主要會碰到的情況:
分布式開發(fā)。
在多進(jìn)程、多線程、多模塊所構(gòu)成的今天最常見的分布式系統(tǒng)開發(fā)中,
socket是第一選擇
。
消息隊列,現(xiàn)在建議不要使用了 ---- 因為找不到使用它們的理由。
在實際中,我個人感覺,PIPE和FIFO可以偶爾使用下,共享內(nèi)存都用的不多了。在效率上說,socket有包裝數(shù)據(jù)和解包數(shù)據(jù)的過程,所以理論上來說socket是沒有PIPE/FIFO快,不過現(xiàn)在計算機上真心不計較這么一點點速度損失的。你費勁糾結(jié)半天,不如我把socket設(shè)計好了,多插一塊CPU來得更劃算。
另外,進(jìn)程間通信的數(shù)據(jù)一般來說我們都會存入數(shù)據(jù)庫的,這樣萬一某個進(jìn)程突然死掉或者整個服務(wù)器死了,也不至于丟失重要數(shù)據(jù)、便于回滾到之前的狀態(tài)。從這個角度考慮,適用共享內(nèi)存的情況也更少了,所以socket使用得更多。再多說一點關(guān)于共享內(nèi)存的:共享內(nèi)存的效率確實高,但它的重點在“共享”二字上。如果的確有好些進(jìn)程共享一大塊數(shù)據(jù)(如果把每個進(jìn)程都看做是類的對象的話,那么共享數(shù)據(jù)就是這個類的static數(shù)據(jù)成員),那么共享內(nèi)存就是一個不二的選擇了。但是在面向?qū)ο蟮慕裉欤覀兏嗟臅r候是多線程+鎖+線程間共享數(shù)據(jù)。因此共享進(jìn)程在今天使用的也越來越少了。
不過,在面對一些極度追求效率的需求時,共享內(nèi)存就會成為唯一的選擇,比如高頻交易系統(tǒng)。除此以外,一般是不需要特意使用共享內(nèi)存的。另外,
PIPE和共享內(nèi)存是不能跨LAN的
(FIFO可以但FIFO只能用于兩個進(jìn)程通信)
。
如果你的分布式系統(tǒng)隨著需求的增加而越來越大所以你想把不同的模塊放在不同機器上而你之前開發(fā)的時候用了PIPE或者共享內(nèi)存,那么你將不得不對代碼進(jìn)行大幅修改......同時,即使FIFO可以跨越LAN,其代碼的可讀性、易操作性和可移植性、適應(yīng)性也遠(yuǎn)沒有socket大。這也就是為什么一開始說socket是第一選擇的原因。
最后還有個信號簡單說一下。
請注意,是信號,不是信號量。
信號量是用于同步線程間的對象的使用的(建議題主看我的答案,自認(rèn)為比較通俗易懂:
semaphore和mutex的區(qū)別? - Linux - 知乎
)。
信號也是進(jìn)程間通信的一種方式。比如在Linux系統(tǒng)下,一個進(jìn)程正在執(zhí)行時,你用鍵盤按Ctrl+c,就是給這個進(jìn)程發(fā)送了一個信號。進(jìn)程在捕捉到這個信號后會做相應(yīng)的動作。
雖然信號是可以自定義的,但這并不能改變信號的局限性:不能跨LAN、信息量極其有限
。
在現(xiàn)代的分布式系統(tǒng)中,通常都是消息驅(qū)動:
即進(jìn)程受到某個消息后,通過對消息的內(nèi)容的分析然后做相應(yīng)的動作。如果你把你的分布式系統(tǒng)設(shè)置成信號驅(qū)動的,這就表示你收到一個信號就要做一個動作而一個信號的本質(zhì)其實就是一個數(shù)字而已。這樣系統(tǒng)稍微大一點的話,系統(tǒng)將變得異常難以維護(hù);甚至在很多時候,信號驅(qū)動是無法滿足我們的需求的。
因此現(xiàn)在我們一般也不用信號了。因此,請記住:
除非你有非常有說服力的理由,否則請用socket。
順便給你推薦個基于socket的輕量級的消息庫:ZeroMQ。
linux怎么指定線程庫?
大概的介紹一下Linux 的指定CPU運行,包括進(jìn)程和線程。linux下的top命令是可以查看當(dāng)前的cpu的運行狀態(tài),按1可以查看系統(tǒng)有多少個CPU,以及每個CPU的運行狀態(tài)。 可是如何查看線程的CPU呢?
top -Hp pid,pid就是你當(dāng)前程序的進(jìn)程號,如果是多線程的話,是可以查看進(jìn)程內(nèi)所有線程的CPU和內(nèi)存使用情況。
pstree可以查看主次線程,同樣的pstree -p pid。可以查看進(jìn)程的線程情況。
taskset這個其實才是重點,可以查看以及設(shè)置當(dāng)前進(jìn)程或線程運行的CPU(設(shè)置親和力)。
taskset -pc pid,查看當(dāng)前進(jìn)程的cpu,當(dāng)然有的時候不只是一個,taskset -pc cpu_num pid ,cpu_num就是設(shè)置的cpu。 這樣的話基本的命令和操作其實大家都知道了,接下來就是在代碼中完成這些操作,并通過命令去驗證代碼的成功率。 進(jìn)程制定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進(jìn)行位與操作 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)
; //先進(jìn)行清空,然后設(shè)置掩碼 CPU_ZERO(&mask); CPU_SET(myid, &mask)
; //設(shè)置進(jìn)程的親和力 if (sched_setaffinity(0, sizeof(mask), &mask) == -1) { printf("warning: could not set CPU affinity, continuing...n"); } while (1) { CPU_ZERO(&get); //獲取當(dāng)前進(jìn)程的親和力 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; } 進(jìn)程設(shè)置CPU運行,其實只能是單線程。多線程設(shè)定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的個數(shù) 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); //這個其實和設(shè)置進(jìn)程的親和力基本是一樣的 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確認(rèn)函數(shù)?
linux C中,獲取當(dāng)前進(jìn)程id 函數(shù)為getpid() ;
頭文件:#include?函數(shù)原型:pid_t?getpid(void);
函數(shù)說明:getpid?()用來取得目前進(jìn)程的進(jìn)程id,許多程序利用取到的此值來建立臨時文件,?以避免臨時文件相同帶來的問題。
返回值:目前進(jìn)程的進(jìn)程id
范例
#include?
#include?
main()
{
????printf("pid=%dn",?getpid());
}執(zhí)行:
pid=1494?/*每次執(zhí)行結(jié)果都不一定相同?*/
總結(jié)
以上是生活随笔為你收集整理的linux C 线程异常退出调查(linux c 线程)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简易征收备案需要什么资料和手续(简易征收
- 下一篇: JArchitect对Java开源贡献者