一 : 殇序引
殇序引
词/雨蝶红儿
夜半梦魇风索骨,寒榻凉衾,晚秋萦薄凉,呓语把君轻喃呢,倾眠不知江波浩,君战嗷骨雷闪鸣,忠贞不阿,昏将蛊毒入杯盏,君自沉冤含雪赴黄泉,独留爱姬银缸守。晓梦未央魂惊煞,隔世笃殷信,携手打马天涯醉,潜溪涓涓逝。
伏身纤弱冰玉骨,梦倚画璧,丝锦薄衫纺花绦,粉襟系流苏,链锁浮生。碧刀千仞,曾昔把仇心里寄,挥刀断袖,巾帼儿女,江湖玲珑闯入尘。纨绔子弟仗皇权,驭权纵乱,拈花惹草娼嬉戏,鸳鸯魂魄飞坠狱,浮华比比皆崔巍,贪婪无厌,恶贯满盈自傲狂,蛊毒入皿亡卿命,忠良渐遭陷,含冤而去肠寸断,民不聊生怎堪愁。丽娥执手剑魂出窍,长剑挽断刺咽喉,涙红彻骨长天啸,丹青照汗青,肝胆盈青天,君魂冤魄可长息,叹只叹,丽姬形影茕茕竟孑哀,岚影伶俜自归隐。
今夕,繁华榭无声,皈依田园,长剑酹地常休憩,江湖恩怨几寥落,天涯痴怨难结,奄奄不成息,怎拾捡清逸,飘飖更覆已成患。
殇婉眉,青丝千尺散,纤指懒绾,两颐染疾,浅白似烟雪,低眉忆惆怅,千番悲悯,万古空花独嗟叹,曾忆夜雨与君话凄婉,今夕成空幻,怎堪寒霜凝心劫,风不解语,凄怆怎流渡。( 文章阅读网:www.61k.com )
惜君如己,青梅入樽皿,杯盏两三,铜盘浅搁凉,月归隐,无星澜,锦瑟年华怎欣沐,红烛渐清瘦,焰光袅袅敛薄温,冉冉清愁理还乱,青台错综成散,心蕴点墨,凄无序,魂无韵,半壁江山怎描破,芊芊絮语谁了意。
丽娥倾城纱衣嫚嫚,胭脂琼楼不堪辱,扬尘紫陌无恙,只言红颜怠眷,病榻独卧,君言镌誓深,怎忘怀?剑舞飞花念逍遥,莫叹烟花成梦,空留傲骨冰释霜,吾自姚妍。清浅怡眉黛,红尘陌上,江畔凤染唇,把渔舟唱晚,呜咽轻抿,衣衫褴褛不堪敛衽,凭栏遥望,倩影若翩鸿,尘沙卷珠箔,风念慰暖谁?
化蝶的流星雨(原创)
二 : 多线程程序设计
一、线程理论基础
1. 多线程
线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者。[www.61k.com]传统的Unix也支持线程的概念,但是在一个进程(process)中只允许有一个线程,这样多线程就意味着多进程。现在,多线程技术已经被许多操作系统所支持,包括Windows/NT、Linux。
2. 为什么有了进程,还要引入线程呢?使用多线程到底有哪些好处?
使用多线程的理由之一是:
和进程相比,它是一种非常“节俭”的多任务操作方式。在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式。
运行于一个进程中的多个线程,它们之间使用相同的地址空间,而且线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。据统计,一个进程的开销大约是一个线程开销的30倍左右。
使用多线程的理由之二是:
线程间方便的通信机制。对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过进程间通信的方式进行,这种方式不仅费时,而且很不方便。线程则不然,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便。
除了以上所说的优点外,多线程程序作为一种多任务、并发的工作方式,有如下优点:
1)使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。
2)改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。
3. Linux系统下的多线程
Linux系统下的多线程遵循POSIX线程接口,称为pthread。编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。
二、 多线程程序设计
1. 创建线程
#include <pthread.h>
int pthread_create(pthread_t * tidp,const pthread_attr_t *attr, void *(*start_rtn)(void),void *arg)
tidp:线程id
attr:线程属性(通常为空)
start_rtn:线程要执行的函数,函数返回值为空指针型
arg:start_rtn的参数,线程函数的参数,必须为指针型
2. 编译
因为pthread的库不是linux系统的库,所以在进行编译的时候要加上-lpthread
# gcc filename -lpthread
3. 实例分析
thread_int.c代码如下:
#include <stdio.h> #include <pthread.h> #include <unistd.h> void *create(void *arg) // pthread_create()函数最后一个参数
{
int *num; num=(int *)arg; printf("creat parameter is %d\n",*num); return (void *)0; } int main(int argc, char *argv[]) { pthread_t tidp; int error; int test=4; int *attr=&test; error=pthread_create(&tidp,NULL,create,(void *)attr); // 参数类型强制类型转换 if(error) { printf("pthread_creat is created in not created ...\n"); return -1; } sleep(1); printf("pthread_create is created ...\n"); return 0;
}
thread_share.c代码如下:
#include <stdio.h> #include <pthread.h> int a=1; void *create(void *arg) { printf("new pthread ... \n"); printf("a=%d \n",a); return (void *)0; } int main(int argc,char *argv[]) { pthread_t tidp; int error; int a=5; error=pthread_create(&tidp,NULL,create,NULL); if(error!=0) { printf("new thread is not create ... \n"); return -1; } sleep(1); printf("new thread is created ... \n"); return 0; }
全局变量在线程函数中也是有效的。
thread_struct.c代码如下:
#include <stdio.h> #include <pthread.h> #include <unistd.h> #include <stdlib.h> struct menber { int a; char *s; }; /*线程执行函数*/ void *create(void *arg) { struct menber *temp; temp=(struct menber *)arg; printf("menber->a = %d \n",temp->a); printf("menber->s = %s \n",temp->s); return (void *)0; } int main(int argc,char *argv[]) { pthread_t tidp; int error; struct menber *b; /*为结构体指针b分配内存并赋值*/ b=(struct menber *)malloc( sizeof(struct menber) ); b->a = 4; b->s = "zieckey"; /*创建线程并运行线程执行函数*/ error = pthread_create(&tidp, NULL, create, (void *)b); if( error ) { printf("phread is not created...\n"); return -1; } sleep(1); //进程睡眠一秒使线程执行完后进程才会结束 printf("pthread is created...\n"); return 0; }
4.终止线程
如果进程中任何一个线程中调用exit或_exit,那么整个进程都会终止。线程的正常退出方式有:
(1) 线程从启动例程中返回
(2) 线程可以被另一个进程终止
(3) 线程自己调用pthread_exit函数
#include <pthread.h>
void pthread_exit(void * rval_ptr)
功能:终止调用线程
Rval_ptr:线程退出返回值的指针,这个值pthread_join()函数可以接受。
5. 线程等待
#include <pthread.h>
int pthread_join(pthread_t tid,void **rval_ptr)
功能:阻塞调用线程,直到指定的线程终止。
Tid :等待退出的线程id
Rval_ptr:线程退出的返回值的指针,函数pthread_exit()函数或return返回的值。
thread_join.c代码如下:
#include <pthread.h> #include <unistd.h> #include <stdio.h> void *thread(void *str) { int i; for (i = 0; i < 3; ++i) { sleep(2); printf( "This in the thread : %d\n" , i ); } return NULL; } int main() { pthread_t pth; int i; /*创建线程并执行线程执行函数*/ int ret = pthread_create(&pth, NULL, thread, NULL); printf("The main process will be to run,but will be blocked soon\n"); /*阻塞等待线程退出*/ pthread_join(pth, NULL); printf("thread was exit\n"); for (i = 0; i < 3; ++i) { sleep(1); printf( "This in the main : %d\n" , i ); } return 0; }
6. 线程标识
#include <pthread.h>
pthread_t pthread_self(void)
功能:获取调用线程的 thread identifier
7. 清除
线程终止有两种情况:正常终止和非正常终止。线程主动调用pthread_exit或者从线程函数中return都将使线程正常退出,这是可预见的退出方式;非正常终止是线程在其他线程的干预下,或者由于自身运行出错(比如访问非法地址)而退出,这种退出方式是不可预见的。
不论是可预见的线程终止还是异常终止,都会存在资源释放的问题,如何保证线程终止时能顺利的释放掉自己所占用的资源,是一个必须考虑解决的问题。
从pthread_cleanup_push的调用点到pthread_cleanup_pop之间的程序段中的终止动作(包括调用pthread_exit()和异常终止,不包括return)都将执行pthread_cleanup_push()所指定的清理函数。
#include <pthread.h>
void pthread_cleanup_push(void (*rtn)(void *),void *arg)
功能:将清除函数压入清除栈
Rtn:清除函数
Arg:清除函数的参数
#include <pthread.h>
void pthread_cleanup_pop(int execute)
功能:将清除函数弹出清除栈
参数:Execute执行到pthread_cleanup_pop()时是否在弹出清理函数的同时执行该函数,非0:执行; 0:不执行
thread_clean.c代码如下:
#include <stdio.h> #include <pthread.h> #include <unistd.h> /*线程清理函数*/ void *clean(void *arg) { printf("cleanup :%s\n",(char *)arg); return (void *)0; } /*线程1的执行函数*/ void *thr_fn1(void *arg) { printf("thread 1 start \n"); /*将线程清理函数压入清除栈两次*/ pthread_cleanup_push( (void*)clean,"thread 1 first handler"); pthread_cleanup_push( (void*)clean,"thread 1 second hadler"); printf("thread 1 push complete \n"); if(arg) { return((void *)1); //线程运行到这里会结束,后面的代码不会被运行。由于是用return退出,所以不会执行线程清理函数。 } pthread_cleanup_pop(0); pthread_cleanup_pop(0); return (void *)1; } /*线程2的执行函数*/ void *thr_fn2(void *arg) { printf("thread 2 start \n"); /*将线程清理函数压入清除栈两次*/ pthread_cleanup_push( (void*)clean,"thread 2 first handler"); pthread_cleanup_push( (void*)clean,"thread 2 second handler"); printf("thread 2 push complete \n"); if(arg) { pthread_exit((void *)2);//线程运行到这里会结束,后面的代码不会被运行。由于是用pthread_exit退出,所以会执行线程清理函数。执行的顺序是先压进栈的后执行,即后进先出。 } pthread_cleanup_pop(0); pthread_cleanup_pop(0); pthread_exit((void *)2); } int main(void) { int err; pthread_t tid1,tid2; void *tret; /*创建线程1并执行线程执行函数*/ err=pthread_create(&tid1,NULL,thr_fn1,(void *)1); if(err!=0) { printf("error .... \n"); return -1; } /*创建线程2并执行线程执行函数*/ err=pthread_create(&tid2,NULL,thr_fn2,(void *)1); if(err!=0) { printf("error .... \n"); return -1; } /*阻塞等待线程1退出,并获取线程1的返回值*/ err=pthread_join(tid1,&tret); if(err!=0) { printf("error .... \n"); return -1; } printf("thread 1 exit code %d \n",(int)tret); /*阻塞等待线程2退出,并获取线程2的返回值*/ err=pthread_join(tid2,&tret); if(err!=0) { printf("error .... "); return -1; } printf("thread 2 exit code %d \n",(int)tret); return 1; }
三、线程同步
进行多线程编程,因为无法知道哪个线程会在哪个时候对共享资源进行操作,因此让如何保护共享资源变得复杂,通过下面这些技术的使用,可以解决线程之间对资源的竞争:
1)互斥量Mutex
2)信号灯Semaphore
3)条件变量Conditions
为什么需要互斥量:
Item * p =queue_list;
Queue_list=queue_list->next;
process_job(p);
free(p);
当线程1处理完Item *p=queue_list后,系统停止线程1的运行,改而运行线程2。线程2照样取出头节点,然后进行处理,最后释放了该节点。过了段时间,线程1重新得到运行。而这个时候,p所指向
的节点已经被线程2释放掉,而线程1对此毫无知晓。他会接着运行process_job(p)。而这将导致无法预料的后果!
对于这种情况,系统给我们提供了互斥量。线程在取出头节点前必须要等待互斥量,如果此时有其他线程已经获得该互斥量,那么该线程将会阻塞在这里。只有等到其他线程释放掉该互斥量后,该线程才有可能得到该互斥量。互斥量从本质上说就是一把锁, 提供对共享资源的保护访问。
在Linux中, 互斥量使用类型pthread_mutex_t表示。在使用前, 要对它进行初始化:
1)对于静态分配的互斥量, 可以把它设置为默认的mutex对象PTHREAD_MUTEX_INITIALIZER
2)对于动态分配的互斥量, 在申请内存(malloc)之后, 通过pthread_mutex_init进行初始化, 并且在释放内存(free)前需要调用pthread_mutex_destroy。
创建
#include <pthread.h>
1)int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr)
2)int pthread_mutex_destroy(pthread_mutex_t *mutex)
加锁
对共享资源的访问, 要使用互斥量进行加锁, 如果互斥量已经上了锁, 调用线程会阻塞, 直到互斥量被解锁。
1)int pthread_mutex_lock(pthread_mutex_t *mutex)
2)int pthread_mutex_trylock(pthread_mutex_t *mutex)
返回值: 成功则返回0, 出错则返回错误编号。
trylock是非阻塞调用模式, 如果互斥量没被锁住, trylock函数将对互斥量加锁, 并获得对共享资源的访问权限; 如果互斥量被锁住了, trylock函数将不会阻塞等待而直接返回EBUSY, 表示共享资源处于忙状态。
解锁
在操作完成后,必须给互斥量解锁,也就是前面所说的释放。这样其他等待该锁的线程才有机会获得该锁,否则其他线程将会永远阻塞。
int pthread_mutex_unlock(pthread_mutex_t *mutex)
互斥量PK信号量
1)Mutex是一把钥匙,一个人拿了就可进入一个房间,出来的时候把钥匙交给队列的第一个。
2)Semaphore是一件可以容纳N人的房间,如果人不满就可以进去,如果人满了,就要等待有人出来。对于N=1的情况,称为binary semaphore。
3)Binary semaphore与Mutex的差异:
1. mutex要由获得锁的线程来释放(谁获得,谁释放)。而semaphore可以由其它线程释放
2. 初始状态可能不一样:mutex的初始值是1 ,而semaphore的初始值可能是0(或者为1)。
三 : 把握导向 正确引领 在对外开放实践中彰显先进性
开展保持共产党员先进性教育活动,是党在继“三讲”、“三个代表”学教活动后,作出的又一重大战略部署,目的就是进一步增强党员的思想政治素质,建立起党员管理的新机制和新方法,促使广大党员真正成为“三个代表”重要思想的忠实组织者、推动者、实践者。作为分管全县对外开放工作的副书记,担负着涉外口党委和党员干部保持先进性的时代重任,应最大限度地从自身保持党员先进性的标准和要求出发,通过表率作用和榜样示范,教育引导他们以推进县域经济社会跨越发展、“三年再造一个##”为发力点,以县委##书记在保持先进性教育形势报告会上提出的“六个争当”为行动原则,增强“五种意识”、争做“五个模范”,为##在全省对俄经贸战略升级中当标兵、做龙头添劲助力、彰显先进。
增强危机意识,争做勤学善用的模范。学习是保持先进性、增长才干、提高工作能力的基础和源泉。离开了知识,思想就失去根基,工作就会无序。涉外部门涉及知识面宽,政策多、变化快、范围广、覆盖大,抓好党员干部学习培训,是克服“知识恐慌”、“本领危机”的致胜法宝和做好对外开放工作的首要环节。应按照先进性能力要求的标准,以提高党员干部政治素养为核心,认真组织开展“三个代表”重要思想的系统学习活动,纠正消极懈怠、浅尝辄止、不求甚解的错误思想和行为,在真学、实学、深学上严要求,在真懂、真信、真用上下功夫,使之化作指导思想的“灵魂”、统领实践的“纲领”、衡量和检验工作成效的尺度,增强政治敏锐性、鉴别力。进一步明确目的,完善制度,引导党员干部深入学习国内外贸易政策法规和与工作联系紧密的财税、金融等市场经济知识,力争使每个党员都能成为“政策通”和发展经济的行家里手,用所掌握的知识应对和规避各种贸易风险。大力弘扬理论联系实际的学风,学用结合,以用促学,学用相长,真正把学到的知识转变为实际的工作能力,达到学以致用、用而有效的最佳状态,使党员干部成为带领企业和群众勇闯国内外市场、推进经贸合作战略升级的实干家,把先进性体现得更为纯粹、具体。
增强开拓意识,争做争先求进的模范。当前,各地参与对俄经贸合作的竞争日趋激烈。涉外部门处于开放前沿,是经贸合作的窗口和桥梁,党员干部能否保持先进性,直接关系到##对外开放的水平和成效。身为分管责任人,应经常与涉外部门党员干部沟通思想、交流体会,帮助他们明确努力方向和目标,夯实“领先一步是财富、落后一步是包袱”的理念,最大限度地激发出能打善闯的拼劲、永不服输的韧劲,大胆开拓、敢为人先、争创一流,在助推全省对俄经贸战略升级的进程中不断实现新突破、开拓新境界。推进思想解放,鼓励涉外部门实事求是地标新立异,跳出单纯的自我发展圈子,努力探索多元贸易方式,集中精力做好贸工结合、旅贸联动、内外互促的特色经贸发展文章。引导树立正确的发展观和开放观,消除畏难情绪和推着干的心理,培养快人一招、敢开先河的精神,在谋发展、办大事、抓落实上,敢想别人没有想过、没有想好的问题,敢做别人没有做过、没有做好的事情,围绕培植发育##等经贸热点,多想办法,多出点子,多下功夫,扩大对内开放,加大南联力度,广招博引,吸聚更多的名企、名牌落户##,广辟经贸增长空间;培养树立争先意识,把先进性真正贯穿到兢兢业业谋发展、扎扎实实干工作上来。强化对俄沟通协调,不断拓展木材、海产品、矿产品加工和石油、煤炭、机械工业产品进出口等合作领域,加快推进投资合作项目建设,强力构筑大通关格局,推动##对俄经贸快步升级。
增强发展意识,争做引领开放的模范。发展高于一切,是解决所有问题的“金钥匙”。推动发展就是保持党员先进性的最好体现。经涉外部门、企业多年努力,##对俄经贸已成为拉动县域经济增长的主导力量,并呈现更强增势。“发展永无止境”,##对外开放要向更高层次迈进,助推全省对俄经贸战略升级,就必须促使涉外口党员干部紧紧围绕开放这一促进发展的主题,一切以发展为大、以开放为先,把握机遇,抢占高地,成为“再造##”的领军者和先锋队。作为分管领导,应主动向涉外部门提供领导决策信息,积极参与、指导制定阶段性工作思路,确保与县委既定部署保持一致;加强与涉外部门的沟通联系,共同追踪经贸发展形势和动态,及时适应性调整,体现思路的前瞻性、针对性和可操作性。身先士卒,甘当表率,积极带领分管部门抢抓一切机遇加快发展,利用对上对外关系通达的优势,全力对口争取,为完善口岸设施、加速辟建国际运输走廊创造条件;强化与联检部门的沟通协调,使其进一步融入地方经济发展潮流,发挥优势,尽好职责,当好排头,在协作推进对俄经贸发展的具体实践中再创新业绩。以践行党员先进性的能力要求和提升涉外部门的工作效能为目标,组织开展业务大练兵、大比武,促动党员干部从实际出发,从利于工作着眼,干一行、爱一行,钻一行、精一行,人人争第一、个个当骨干,真正成为业务上的精英、行业中的先进,达到互促互励、共同提高的目的,更好地担负起发展振兴##的历史重任。
增强责任意识,争做利企为民的模范。##口岸是我省对俄边贸的龙头,是展示龙江对外开放风貌的窗口。近年来,随着口岸经济迅猛发展,受俄市场的吸引,外地客商和战略投资者纷至沓来,人流、商机汇聚,涉外部门面对的服务对象日益增多并相对复杂,工作量也呈倍增之势。应通过开展先进性教育活动,使党员干部始终牢记全心全意为人民服务的宗旨,始终牢记“两个务必”,明白“为企业服务就是为自己谋利”的道理,进一步增强责任意识,站在促进##口岸持久繁荣的战略高度,推进职能转变,崇尚“服务第一”,平等对待内外企业,真心关爱企业、呵护企业家,为其提供无微不至的扶持和服务,做到“扶上马,送一程”;充分发挥职能优势,竭心尽力解决企业遇到的发展难题,帮助融通关系、协调资金、招引人才、提供信息,扎扎实实为企业排忧解难,尽心尽力把各项服务工作做好、办实。积极在涉外口党员干部中倡行“务百姓富裕之实”风气,增强群众观念,扎实转变作风,利用##对俄经济技术合作连续##年位居全省首位的工作基础和俄远东地区劳动力供求缺口逐步扩大的机遇,真诚对待,真心帮助,为经##口岸往返的劳务输出人员在各方面提供最大的方便,促其“便利走出去,快速富起来”;把关爱百姓、多办实事做为评价涉外党委及党员先进性的重要标准,动员参与开展城市一帮一扶贫解困和利民行动,在扶助弱势群体上拿出实招、做出样子,对普通百姓多帮一些、善待一层,真正成为亲民、爱民的表率。
增强奉献意识,争做实干苦干的模范。涉外部门肩负着对俄经贸战略升级的光荣使命,必须培养党员干部不怕吃苦、甘于奉献的精神,把一切思想和行动都融入到扩大开放、造福百姓的事业中,立足岗位,敬业精业,务好本行;心系全局,不计得失,奉献为乐,用自身的模范行为和工作业绩体现涉外口党员的先进性。从对外经贸发展和“再造##”的需要出发,在涉外口党员干部中继续弘扬求真务实之风,坚决杜绝虚报浮夸,崇尚少说多做、苦干实干,一步一个脚印,务求工作实效,认真履行好份内职责,用工作实绩体现先进性教育的成果。大力提倡清廉守纪,针对涉外党员干部工作在开放一线、手中掌控一定的权力、时刻面对着来自于各方面利诱的实际,以先进性教育为切入点,引导他们树牢正确的权力观、地位观和利益观,深刻认识到贪欲之害、不廉之果、失足之恨,守廉从廉,严以律己,时刻以党性要求规范自身言行;教育他们对待个人利益坚持“责重钱轻,永葆清白”,对待身外之物心不贪、手不伸、眼不乱,使用手中权力时不踏警戒线、接触高压线,在小节上“不给别人一点送礼的由头,不让自己有半点腐败的念头”,从自身做起,从身边事做起,清正廉洁,做好表率,以实际行动保持党员的先进性。
61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1