- 浏览: 4398302 次
- 性别:
- 来自: 湛江
博客专栏
-
SQLite源码剖析
浏览量:80056
-
WIN32汇编语言学习应用...
浏览量:70003
-
神奇的perl
浏览量:103310
-
lucene等搜索引擎解析...
浏览量:285648
-
深入lucene3.5源码...
浏览量:15001
-
VB.NET并行与分布式编...
浏览量:67511
-
silverlight 5...
浏览量:32116
-
算法下午茶系列
浏览量:45966
文章分类
最新评论
-
yoyo837:
counters15 写道目前只支持IE吗?插件的东西是跨浏览 ...
Silverlight 5 轻松开启绚丽的网页3D世界 -
shuiyunbing:
直接在前台导出方式:excel中的单元格样式怎么处理,比如某行 ...
Flex导出Excel -
di1984HIT:
写的很好~
lucene入门-索引网页 -
rjguanwen:
在win7 64位操作系统下,pygtk的Entry无法输入怎 ...
pygtk-entry -
ldl_xz:
http://www.9958.pw/post/php_exc ...
PHPExcel常用方法汇总(转载)
knoppix@Microknoppix:/mnt-system/lx/test$ gcc -D_REENTRANT -lpthread -o testcondout testcondout.c
knoppix@Microknoppix:/mnt-system/lx/test$ ./testcondout
please input an integer:(<=1000)26
time out
time out
1/1 finished,push 1.0000000000
1/2 finished,push 0.5000000000
1/3 finished,push 0.3333333333
1/4 finished,push 0.2500000000
1/5 finished,push 0.2000000000
time out
1/6 finished,push 0.1666666667
1/7 finished,push 0.1428571429
1/8 finished,push 0.1250000000
1/9 finished,push 0.1111111111
1/10 finished,push 0.1000000000
time out
1/11 finished,push 0.0909090909
1/12 finished,push 0.0833333333
1/13 finished,push 0.0769230769
1/14 finished,push 0.0714285714
1/15 finished,push 0.0666666667
1/1:1.0000000000 added result 1.0000000000
1/2:0.5000000000 added result 1.5000000000
1/3:0.3333333333 added result 1.8333333333
1/4:0.2500000000 added result 2.0833333333
1/5:0.2000000000 added result 2.2833333333
1/6:0.1666666667 added result 2.4500000000
1/7:0.1428571429 added result 2.5928571429
1/8:0.1250000000 added result 2.7178571429
1/9:0.1111111111 added result 2.8289682540
1/10:0.1000000000 added result 2.9289682540
1/11:0.0909090909 added result 3.0198773449
1/12:0.0833333333 added result 3.1032106782
1/13:0.0769230769 added result 3.1801337551
1/14:0.0714285714 added result 3.2515623266
1/15:0.0666666667 added result 3.3182289932
*******1/1:1.0000000000 computed result 1.0000000000
*******1/2:0.5000000000 computed result 0.5000000000
*******1/3:0.3333333333 computed result 0.8333333333
*******1/4:0.2500000000 computed result 0.5833333333
*******1/5:0.2000000000 computed result 0.7833333333
*******1/6:0.1666666667 computed result 0.6166666667
*******1/7:0.1428571429 computed result 0.7595238095
*******1/8:0.1250000000 computed result 0.6345238095
*******1/9:0.1111111111 computed result 0.7456349206
*******1/10:0.1000000000 computed result 0.6456349206
*******1/11:0.0909090909 computed result 0.7365440115
*******1/12:0.0833333333 computed result 0.6532106782
*******1/13:0.0769230769 computed result 0.7301337551
*******1/14:0.0714285714 computed result 0.6587051837
*******1/15:0.0666666667 computed result 0.7253718504
===============compute finish!=========== result:0.7253718504
1/16 finished,push 0.0625000000
1/17 finished,push 0.0588235294
1/18 finished,push 0.0555555556
1/19 finished,push 0.0526315789
1/20 finished,push 0.0500000000
1/16:0.0625000000 added result 3.3807289932
1/17:0.0588235294 added result 3.4395525226
1/18:0.0555555556 added result 3.4951080782
1/19:0.0526315789 added result 3.5477396571
1/20:0.0500000000 added result 3.5977396571
1/21 finished,push 0.0476190476
1/22 finished,push 0.0454545455
1/23 finished,push 0.0434782609
1/24 finished,push 0.0416666667
1/25 finished,push 0.0400000000
time out
*******1/16:0.0625000000 computed result 0.6628718504
*******1/17:0.0588235294 computed result 0.7216953798
*******1/18:0.0555555556 computed result 0.6661398242
*******1/19:0.0526315789 computed result 0.7187714032
*******1/20:0.0500000000 computed result 0.6687714032
*******1/21:0.0476190476 computed result 0.7163904508
*******1/22:0.0454545455 computed result 0.6709359053
*******1/23:0.0434782609 computed result 0.7144141662
*******1/24:0.0416666667 computed result 0.6727474995
*******1/25:0.0400000000 computed result 0.7127474995
===============compute finish!=========== result:0.7127474995
1/21:0.0476190476 added result 3.6453587048
1/22:0.0454545455 added result 3.6908132502
1/23:0.0434782609 added result 3.7342915111
1/24:0.0416666667 added result 3.7759581778
1/25:0.0400000000 added result 3.8159581778
1/26 finished,push 0.0384615385
time out
time out
*******1/26:0.0384615385 computed result 0.6742859611
===============compute finish!=========== result:0.6742859611
1/26:0.0384615385 added result 3.8544197162
================add finish!============ result:3.8544197162
2个线程完成累加和累加减运算(其中一个采用超时等待条件信号,另一个采用等待条件信号),n个线程完成计算每个符点数
#include <pthread.h> #include <bits/pthreadtypes.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #define MAXS 1000 #define MAXTDS 5 //线程池大小 double myjg[MAXS+1];//计算结果存放位置 int max; pthread_mutex_t eventlock; //互斥锁 pthread_cond_t myevent; //条件变量 pthread_t threads[MAXTDS+2]; //线程池,完成1/n计算 int isend=0; int done; void *mycomp(void *x){//计算1/i的结果,计算结果放在一个数组中。 int i=0; int rc; while (1){ pthread_mutex_lock(&eventlock); if (isend){ pthread_mutex_unlock(&eventlock); break; } i=myjg[0];//myjg[0]存放着线程已经计算到的i。 if (i<max){ i++; myjg[0]=i; } if (i==max){//最后一个数 myjg[i]=(1/(double)i); isend=1; printf("1/%d finished,push %.10f\n",i,myjg[i]); fflush(stdout); pthread_mutex_unlock(&eventlock); sleep(3); rc=pthread_cond_signal(&myevent);//广播信号,多个任务不被阻塞,多个任务竞争互斥锁的所有权。也可以使用pthread_cond_signal(&event);发送信号,这样只有一个线程不被阻塞,其它线程都被阻塞。 if (rc){ perror("pthread_cond_broadcast"); fflush(stdout); } sleep(2); break; } //开始计算 myjg[i]=(1/(double)i); printf("1/%d finished,push %.10f\n",i,myjg[i]); fflush(stdout); pthread_mutex_unlock(&eventlock); if (!(i%MAXTDS)){ sleep(3); pthread_cond_broadcast(&myevent);//广播信号,多个任务不被阻塞,多个任务竞争互斥锁的所有权。也可以使用pthread_cond_signal(&event);发送信号,这样只有一个线程不被阻塞,其它线程都被阻塞。 sleep(3); } } pthread_exit(NULL); } void *myprint1(void *xx){//读取数组,将计算结果累加,最终完成1/1+1/2+1/3+......+1/n的计算,使用超时等待 int maxi; int curj=1; double jg=0; int rc; struct timeval now;//使用微秒 struct timespec timeout; //使用纳秒 while(curj<=max) { //取当前时间 // 深未来技术http://deepfuture.iteye.com/ gettimeofday(&now); //准备时间间隔 timeout.tv_sec=now.tv_sec+1; timeout.tv_nsec=now.tv_usec*1000; maxi=0; pthread_mutex_lock(&eventlock);//用于条件变量的互斥,条件变量就是一个用来发送事件发生信号的信号量 rc=pthread_cond_timedwait(&myevent,&eventlock,&timeout);//在等待条件变量myevent的发生,超时就返回,不再等待。条件变量必须与一个互斥锁eventlock相关联,条件变量不提供锁定,必须有一个互斥锁eventlock配合。 //互斥锁eventlock在调用wait前应锁定,然后在wait期间,互斥量eventlock被解锁。挂起线程执行,直到条件变量myevent收到信号 if (rc==0){ // 深未来技术http://deepfuture.iteye.com/ maxi=myjg[0]; fflush(stdout); pthread_mutex_unlock(&eventlock); for (;curj<=maxi;curj++) { // 深未来技术http://deepfuture.iteye.com/ jg+=myjg[curj]; printf("1/%d:%.10f added result %.10f\n",curj,myjg[curj],jg); fflush(stdout); } } else if (rc==ETIMEDOUT){//TIMEOUT printf("time out\n"); fflush(stdout); pthread_mutex_unlock(&eventlock); continue; } else { // 深未来技术http://deepfuture.iteye.com/ perror("pthread_cond_wait"); fflush(stdout); pthread_mutex_unlock(&eventlock); continue; } } printf("================add finish!============ result:%.10f\n",jg);//输出累加结果。 fflush(stdout); pthread_exit(NULL); } void *myprint2(void *xx){//读取数组,将计算结果完成1/1+1/2-1/3+1/4-1/5......的计算 int maxi=0; int curi=1; double jg=0; int fh=1; int rc; while(curi<=max) { maxi=0; sleep(2); pthread_mutex_lock(&eventlock);//用于条件变量的互斥,条件变量就是一个用来发送事件发生信号的信号量 rc=pthread_cond_wait(&myevent,&eventlock);//在等待条件变量myevent的发生。条件变量必须与一个互斥锁eventlock相关联,条件变量不提供锁定,必须有一个互斥锁eventlock配合。 //互斥锁eventlock在调用wait前应锁定,然后在wait期间,互斥量eventlock被解锁。挂起线程执行,直到条件变量myevent收到信号 // 深未来技术http://deepfuture.iteye.com/ if (rc==0){ maxi=myjg[0]; fflush(stdout); pthread_mutex_unlock(&eventlock); while (curi<=maxi){ jg+=fh*myjg[curi]; printf("*******1/%d:%.10f computed result %.10f\n",curi,myjg[curi],jg); fflush(stdout); fh=-fh; curi++; } printf("===============compute finish!=========== result:%.10f\n",jg);//输出累加结果 fflush(stdout); } else{//error perror("pthread_cond_wait"); fflush(stdout); pthread_mutex_unlock(&eventlock); continue; } } pthread_exit(NULL); } int main(){ //计算1+1/2+1/3+......和1+1/2-1/3+1/4-1/5...... pthread_mutex_init(&eventlock,NULL); pthread_cond_init(&myevent,NULL); int i =0; printf("please input an integer:(<=%d)",MAXS); while (scanf("%d",&max),max>MAXS){//n的最大值 printf("please input an integer:(<=%d)",MAXS); }; //深未来技术http://deepfuture.iteye.com/ myjg[0]=0; pthread_create(&(threads[i]),NULL,myprint1,(void *)&i); sleep(1); i++; pthread_create(&(threads[i]),NULL,myprint2,(void *)&i); sleep(1); i++; for (;i<=MAXTDS;i++){ pthread_create(&(threads[i]),NULL,mycomp,(void *)&i); sleep(1); } sleep(MAXTDS*2*(i/10+1)); //wait...... pthread_mutex_destroy(&eventlock); return(0); }
发表评论
-
c++科学计算库
2013-06-05 21:58 4393http://www-900.ibm.com/develop ... -
wxwidgets-学习心得(2)
2013-05-14 22:17 2234#include <wx/wx.h> #inc ... -
wxwidgets学习心得(1)
2013-05-13 12:01 2470#include <wx/wx.h> / ... -
gtk+学习笔记-2
2013-04-11 11:16 2021对gtk+初始化的检查 gtk_init_check(& ... -
gtk+学习笔记-1
2013-04-11 10:50 1609#include <stdlib.h> #i ... -
lisp-基本输入,输出,read,print
2013-02-09 22:51 3199* (say-hello)ssssssss"wha ... -
lisp-push
2013-02-09 20:41 1525* (defvar *mylist* (list 11 2 ... -
lisp-find
2013-02-09 14:08 1514* (find `wang `((wang 22)(li 2 ... -
lisp-交换列表中2个元素
2013-02-08 20:10 2325* (defvar *mylist* (list 1 2 ... -
lisp-求最大和最小数,if的使用
2013-02-08 17:04 2672* (defun maxnum(x y) (if (> ... -
lisp-关于mapcar、apply、assoc 列表操作
2013-02-08 12:53 65340[2] (mapcar #'+ `(22 11 55) ... -
lisp-progn
2013-02-05 09:43 2107* (if (oddp 5) (progn (setf * ... -
lisp-列表
2013-02-01 21:33 1630This is experimental prerelea ... -
lisp-复数
2013-01-30 22:23 1361* (+ #C(28 10) 22) #C(50 10 ... -
lisp-局部变量和局部函数
2013-01-30 22:07 2204* (flet ((add (a b) (+ a b))) ... -
lisp强大
2013-01-30 21:02 2854以前就听说过Lisp被很多人认为是世界上最好的语言 ,但是它 ... -
lisp-猜数字升级版
2013-01-30 18:03 18230[2] (defun mystart() (defpara ... -
lisp-猜数字算法与全局函数、变量
2013-01-30 17:55 1608* (defvar *big* 100) *BIG* ... -
c++中stack,deque,queue
2012-08-30 21:36 3745STL包含一些为满足特殊需求而设计的容器,他们提供简单而清晰的 ... -
(转)去掉c++的变量的const类型
2012-04-24 16:02 14417const_cast (expression) const_ ...
相关推荐
- **线程同步**:通过信号量、互斥锁等确保线程安全地访问队列和状态信息。 - **结束线程池**:所有任务完成后,关闭线程池,等待所有线程退出。 6. **示例代码结构** - `ThreadPool`结构体:存储线程池的状态,...
5. **线程同步与通信**:为了确保线程安全,线程池可能使用互斥锁、条件变量等同步机制来控制对任务队列的访问。线程间的通信也可能是通过信号量、管道或共享内存等方式实现。 6. **线程池的扩展与收缩**:根据系统...
5. **线程同步与通信**:线程间同步和通信是通过互斥量、信号量、条件变量等同步原语实现的。例如,当任务队列为空时,工作线程需要等待条件变量的通知;当有新任务时,任务提交者会通过信号量或互斥量唤醒等待的...
linux pthreadpool实现和线程池的用处 简单易懂 互斥和信号量使用
5. **信号量**(可选):可以使用信号量控制线程池中线程的数量,防止过多线程同时运行。 实现线程池的步骤大致如下: 1. 初始化线程池结构,包括线程池队列、互斥锁和条件变量。 2. 创建工作线程,这些线程会进入...
"thd_pool_v1.02.tar.bz2.zip_linux_linux线程池_whale1ce_线程池"这个压缩包包含了一个由用户whale1ce编写的线程池实现,版本为v1.02。 线程池的基本思想是预先创建一组线程,而不是每当需要执行任务时就创建一个...
开发者需要自己设计数据结构来存储线程和任务,以及实现线程间的同步和通信机制,如互斥锁、条件变量、信号量等。 从文件名称“threadpool”来看,这可能是源代码文件或者库的名字,其中可能包含了线程池的核心实现...
由于多个线程可能同时尝试访问或修改同一个文件,因此需要使用互斥锁(`pthread_mutex_t`)或者信号量(`pthread_semaphore_t`)来确保线程安全。此外,条件变量(`pthread_cond_t`)可以用来协调线程的执行顺序,...
- **条件变量(Condition Variable)**:线程在等待某个条件满足时可以释放互斥量并进入等待状态,条件满足时由其他线程唤醒。 - **信号量(Semaphore)**:用于控制同时访问特定资源的线程数量,可以实现线程的...
常见的同步机制有互斥锁(mutex)、条件变量(condition variable)、信号量(semaphore)等。 4. **线程池的大小**:线程池大小的设定需要根据系统的资源情况和任务特性来调整,过大可能导致资源浪费,过小则可能...
在多线程环境下,各线程可以共享资源,提高CPU利用率,但同时也需要处理线程同步和通信问题,如互斥锁、条件变量、信号量等,以防止数据竞争和死锁。在高并发场景下,合理利用多线程可以显著提升程序的响应速度和...
5. **线程同步与通信**:线程池中的线程可能需要进行同步和通信,例如使用互斥量、条件变量、信号量等同步原语,确保数据的一致性和正确性。 6. **线程数量动态调整**:线程池可能会根据系统负载和任务特性动态地...
在Linux下,可以使用互斥量(mutex)和条件变量(condition variable)来实现线程安全的数据结构,确保多线程环境下的正确同步。 2. **工作队列**:用于存储待执行的任务。线程池管理器将新任务放入队列,而工作...
- 信号量(Semaphore):计数型信号量用于限制对资源的并发访问,二进制信号量类似互斥量。 - 线程间通信还可以使用读写锁、屏障、原子操作等。 6. **线程调度**: - Linux内核线程调度器负责线程的调度,遵循...
线程间的通信可以通过共享内存、信号量、互斥锁等机制实现。 **线程池的实现原理** 实现线程池通常需要以下几个组件: 1. **线程池结构体**:存储线程池的状态、线程数组、任务队列等信息。 2. **任务队列**:...
【线程池模式在Linux环境下的应用】 线程池是一种多线程编程的高效解决方案,尤其在Linux操作系统中,利用POSIX线程库(pthread)实现。线程池通过预先创建一组工作线程,用于并发处理任务,从而提高系统的响应速度...
- **信号量机制**:通过计数器来控制对资源的访问,灵活性较高,但实现较为复杂。 - **自旋锁**:不断循环检查锁的状态直到获得锁,适用于短时间等待的场景,但长时间等待会导致CPU资源浪费。 - **管程**:为一组...
本压缩包"5_sysv_sync_mutex.tgz"包含了与System V信号量相关的源码示例,它可能包含了一个或多个C语言编写的程序,用于演示如何在实际应用中使用System V信号量实现同步和互斥。 System V信号量是一种在不同进程间...
用信号量实现进程互斥示例 32System V信号量(三) 用信号集解决哲学家就餐问题 33System V共享内存与信号量综合 用信号量解决生产者消费者问题 实现shmfifo 34POSIX消息队列 POSIX消息队列相关函数 POSIX...
本文将深入探讨如何使用C++在Linux环境下构建一个epoll+线程池的服务器程序,以及如何实现线程池中的互斥锁和信号量封装。 首先,epoll是Linux内核提供的I/O多路复用机制,相较于传统的select和poll,它具有更高的...