Linux Pthread

http://blog.csdn.net/hudashi/article/details/7709413

http://linux.chinaitlab.com/administer/963752.html

http://www.cnblogs.com/hoys/archive/2011/07/06/2098931.html

http://blog.csdn.net/yetyongjin/article/details/7673837


//2014-8-26 16:52:42  PTHREAD

sysctl -a |grep thread

ulimit -a   //查看当前堆栈大小,默认8M  32bit系统最大识别4G,每个进程的虚拟内存是4G,4G/8M~382个线程

ulimit -s 1024  (k)   
//pthread_create创建大量线程时 Resource temporarily unavailable

pthread_attr_getstacksize(&attr, &stack_size);

为了能创建更多线程,第一条路是创建多进程,第二条路是减少线程栈的大小。

pthread_join SIGSEGV 段错误  
if(pthread_kill(pthread_handle, 1)!=0), 结果是SIGHUP错误。
没辙,加了一个死循环:  while(flag) {usleep(5000);}

//http://blog.csdn.net/yi_jun_jun/article/details/2890934


遗留问题:假如循环创建线程,达到上限必出现Resource temporarily unavailable,线程的虚拟内存如何释放。



//2014-8-27 10:38:55

ulimit -s 1024*1024命令,将线程栈大小临时设置成1M,经过试验能同时创建2000个线程了。
有两种值可供选择:PTHREAD_EXPLICIT_SCHED和PTHREAD_INHERIT_SCHED,前者表示新线程使用显式指定调度策略和调度参数
(即attr中的值),而后者表示继承调用者线程的值。缺省为PTHREAD_EXPLICIT_SCHED。
/etc/security/limits.d/90-nproc.conf 
pthread_attr_setscope
功能:        设置线程 __scope 属性。scope属性表示线程间竞争CPU的范围,也就是说线程优先级的有效范围。
POSIX的标准中定义了两个值:PTHREAD_SCOPE_SYSTEM和PTHREAD_SCOPE_PROCESS,前者表示与系统中所有线程一起竞争CPU时间,
后者表示仅与同进程中的线程竞争CPU。默认为PTHREAD_SCOPE_PROCESS。目前LinuxThreads仅实现了PTHREAD_SCOPE_SYSTEM一值。

/etc/security/limits.conf

int pthread_setschedparam(pthread_t target_thread, int policy, const struct sched_param *param)
在多线程开发中经常被使用的,它主要用于设置线程的调用策略和优先级。


http://blog.csdn.net/gpengtao/article/details/7792860
pthread_attr_init 线程属性
linux进程调度(SCHED_OTHER,SCHED_FIFO,SCHED_RR)linux内核的三种调度方法:
1,SCHED_OTHER 分时调度策略;
2,SCHED_FIFO实时调度策略,先到先服务;
3,SCHED_RR实时调度策略,时间片轮转 ;
实时进程将得到优先调用,实时进程根据实时优先级决定调度权值,分时进程则通过nice和counter值决定权值,nice越小,counter越大,被调度的概率越大,也就是曾经使用了cpu最少的进程将会得到优先调度。
SHCED_RR和SCHED_FIFO的不同:
当采用SHCED_RR策略的进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。放在队列尾保证了所有具有相同优先级的RR任务的调度公平。 
SCHED_FIFO一旦占用cpu则一直运行。一直运行直到有更高优先级任务到达或自己放弃。
如果有相同优先级的实时进程(根据优先级计算的调度权值是一样的)已经准备好,FIFO时必须等待该进程主动放弃后才可以运行这个优先级相同的任务。而RR可以让每个任务都执行一段时间。
相同点:
RR和FIFO都只用于实时任务。
创建时优先级大于0(1-99)。
按照可抢占优先级调度算法进行。
就绪态的实时任务立即抢占非实时任务。


系统中既有分时调度,又有时间片轮转调度和先进先出调度
1,RR调度和FIFO调度的进程属于实时进程,以分时调度的进程是非实时进程。
2,当实时进程准备就绪后,如果当前cpu正在运行非实时进程,则实时进程立即抢占非实时进程。
3,RR进程和FIFO进程都采用实时优先级做为调度的权值标准,RR是FIFO的一个延伸。FIFO时,如果两个进程的优先级一样,则这两个优先级一样的进程具体执行哪一个是由其在队列中的位置决定的,这样导致一些不公正性(优先级是一样的,为什么要让你一直运行?),如果将两个优先级一样的任务的调度策略都设为RR,则保证了这两个任务可以循环执行,保证了公平。


pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED,NULL);
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);

 err = pthread_create(&th1,NULL,thr,NULL);
 pthread_cancel(th1);
 pthread_join(th1,NULL);
 
pthread_cleanup_push(pthread_mutex_unlock, (void*) &mut);
pthread_mutex_lock(&mut);
/* do some work */
pthread_mutex_unlock(&mut);
pthread_cleanup_pop(0); 
 
 
 在POSIX线程API中提供了一个pthread_cleanup_push()/pthread_cleanup_pop()函数
 对用于自动释放资源--从pthread_cleanup_push()的调用点到pthread_cleanup_pop()
 之间的程序段中的终止动作(包括调用pthread_exit()和取消点终止)
 都将执行pthread_cleanup_push()所指定的清理函数。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值