linux C 线程异常退出调查(linux c   线程)-编程之家

Exception in thread "main" 解决办法?

Java命令行执行的时候,会出这样的出错信息Exception in thread main java. lang. NoclasSdeffounderror:应该这样检查你的环境和你的操作:

1、你的文件名对吗?JAVA要求你的文件和你的类名严格对应的。比如 public class Helloword{..-那么文件名一定只能是 Helloworld. java,看仔细了!

linux C 线程异常退出调查(linux c   线程)-编程之家

2、你的程序中有main方法马?参数什么的对吗?main方法的声明应该是这样子的: public static Void main( Stringl们args)事实上如果你用开发工具来做的话,是不会错的。如果你用 Ultraedit<之类的来写程序的话,就一个字不要改的照抄吧!

linux C 线程异常退出调查(linux c   线程)-编程之家

3、记住, Javac后面跟的参数是文件名,但java后面跟的是类名!这是我开始学JAVA是犯的错, java Helloworld, class,然后就报错。后来才弄明白,应该是 ava Helloworld。

linux C 线程异常退出调查(linux c   线程)-编程之家

4、设置了 classpath了吗?不仅是在安装JDK时要设置的内容,一般来说最好还要自己设置一个目录来存放自己的类文件的。比如d:Nclass E目录。设置 classpath=% classpath%;dclass-那么,现在将 Helloworlc. class文件COPY到d: class E目录下,再 java Hello World应该就OK了。

linux C 线程异常退出调查(linux c   线程)-编程之家

5、结合第3点和第4点如果你的类是属于某一个包的,比如这样一个类sony. test. Helloworld,那么按照我在第4点中说的目录来说,就应该Helloworld, class文件存放到d: classsonytest目录下。

执行的时候应该参考第3点中说的,按类名执行: java sony test, Hello World。明白了吗?一直我也想不出还会有什么理由造成这个出错信息了!如果有哪位兄弟想到了就补充一下吧!其实如果你使用了一些比较好的编程工具的话,根本就没有机会碰到这个错误的,至少我在使用了 Visual/ Age for Java之后,就没有这样的事情了。好啦,不说了祝同志们好运吧!过了这第一道门,后面的就比较简单啦。

linux C 线程异常退出调查(linux c   线程)-编程之家

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 /*每次执行结果都不一定相同 */