1.定义 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 2.关系 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行. 相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。 3.区别 进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并 继续阅读 >>


楚东方 17/12/21 23:48:08
题意: 有n只兔子在不同的位置,任意一只兔子可以跳到其余任两只兔子(必须保证它们中间有空位)中间,问最多可移动多少次? 思路: 可看作从任一侧的兔子向中间插空,因此可以将所有兔子中间的空位数相加,再减去两侧较小的数字(最左侧两只兔子间距离与最右侧两只兔子间距离的较小的值)。 AC代码: #include<iostream> #include<vector> #include<cstring> using namespace std; int main() { int t, n, sum, addr[500]; int front, rear; cin >> t; while(t--) { sum = 0; memset(addr, 0, sizeof(addr)); cin >> n >> addr[0]; for(int i = 1; i < n; i 继续阅读 >>


王良 17/12/21 22:09:16
先明确几个概念: 常对象只能调用常成员函数。 普通对象可以调用全部成员函数。 当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数,每次成员函数存取数据成员时,由隐含使用this指针。 当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向这个成员函数所在的对象的指针。 在C++中,this指针被隐含地声明为: X *const this,这意味着不能给this 指针赋值; 在X类的const成员函数中,this指针的类型为:const X* const, 这说明this指针所指向的这种对象是不可修改的(即不能对这种对象的数据成员进行赋值操作); 由于this并不是一个常规变量,所以,不能取得this的地址。 如: #include <iostream> class A { public: A():mValue(0) { } void print() { std::cout<&l 继续阅读 >>


刘嘉辉 17/12/21 21:37:47
两个可能相交的单链表,找出他们的交点 模型 head a1 a2 \ / \ / \ / | | | | tail 注意是单链表,所以他们的形状会是Y型而非X型。 分析 首先,最简单的一种方法是遍历,只是时间复杂度特别高。 简单来说,这两条链表的相交前长度都是不同的,但相交后的长度一致,那么只要想办法让他们从后往前遍历,就很容易找到交点。 - 存数组 - 用栈 其实都是相近的办法,但是栈比较高大上。 那么,就好办了,同时出栈或者同时逆序遍历,遇到下一节点不同的就是交点。 作者:baidu_35085676 发表于2017/12/21 17:56:11 原文链接 阅读:1 评论:0 查看评论 继续阅读 >>


李余通 17/12/21 17:56:11
#include<stdio.h> int a[100]; int n; void quicksort( int left,int right ); int main() { int i,j; scanf( "%d",&n ); for( i = 0;i < n;i++ ) { scanf( "%d",&a[i] ); //输入数据 } quicksort( 0,n-1 ); //快排 for( i = 0;i < n;i++ ) { printf( "%d ",a[i] ); } printf( "\n" ); return 0; } void quicksort( int left,int right ) { int i,j,t,tmp; if( left > right ) { return ; } tmp = a[ le 继续阅读 >>


吕子健 17/12/20 21:51:45
谈起GC,应该是让Java程序员最激动的一项技术,我相信每个Java程序员都有探究GC本质的冲动! 本篇博客围绕三个问题展开: 1.哪些内存需要回收? 2.什么时候回收? 3.如何回收? 哪些内存需要回收 首先回答第一个问题:不再使用的对象需要进行回收,不使用的类也有可能回收。 那么我们如何判断一个对象不再使用呢?主要有以下两种方法。 引用计数算法 定义:给对象添加一个引用计数器,每当有一个地方引用它时,计数器就加1;当引用失效时,计数器就减一;任何时刻计数器为0的对象就是不会被使用的对象。 我们可以看出,引用技术方法实现简单。并且有一些GC中确实使用的是引用计数算法,但是在Java虚拟机中并没有使用这个方法进行内存管理,原因就是一个问题很难被解决—对象之间循环引用。 来看一个例子: class Node { Node next ; } Node a = new Node (); Node b = new Node (); a.next = b ; b.next = a ; 继续阅读 >>


董恒毅 17/12/20 20:26:28
源码分析章节,我尽量使用原生的redis源码,不去看黄建宏的注释,提高自己阅读源码的能力,此外,redis版本还是3.0 源码下载,大家可以到这 http://download.redis.io/releases/ sdsnew typedef char *sds; sds sdsnewlen(const void *init, size_t initlen) { struct sdshdr *sh; //分配内存 if (init) { sh = zmalloc(sizeof(struct sdshdr)+initlen+1); } else { sh = zcalloc(sizeof(struct sdshdr)+initlen+1); } //分配失败返回NULL if (sh == NULL) return NULL; sh->len = initlen; sh->free = 0;//这里可以看到sds初始是 继续阅读 >>


李余通 17/12/19 22:48:51
运算符重载 #include<iostream> using namespace std; class CInt { friend ostream& operator<<(ostream& out,const CInt & timp); private: int i; public: CInt (int d) { i=d; }; CInt(const CInt &timp) { i=timp.i; } public: CInt operator+(const CInt &timp)const //CInt add(const CInt &timp)const { return(i+timp.i); } CInt add(const CInt &timp)const { return(i+timp.i); } 继续阅读 >>


高嘉两 17/12/19 22:47:12
创建线程: /************************************************************************* > File Name: 1.cpp > Author: 朱紫钰 > Mail: zhuziyu1157817544@gmail.com > Created Time: 2017年12月19日 星期二 13时32分14秒 ************************************************************************/ #include<iostream> #include <thread> using namespace std; void fun() { cout << "This is thread of " << this_thread::get_id()<< endl; } void fun2(int a) 继续阅读 >>


朱紫钰 17/12/19 14:19:45
第一个Servlet程序 package cc.openhome; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/hello.view") public class HelloWorld extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServlet 继续阅读 >>


贺含悦 17/12/19 00:47:45