生产者模拟队列

来源:互联网 发布:代码高亮 算法 编辑:程序博客网 时间:2024/05/22 05:31

题目:实现一个队列
队列的应用场景为:
一个生产者线程将int类型的数入列,一个消费者线程将int类型的数出列。

这段代段太美了,值得保存、

#include <iostream>#include <pthread.h>using namespace std;template<class T,int SIZE=1024>class Circular{public:T queue[SIZE];int begin,end;Circular():begin(0),end(0){}bool empty(){return begin==end;}bool full(){return (end+1)%SIZE==begin;}void waitFull(){int st=1;while(full()){usleep(st);st=min(1000,st*2);}}void waitEmpty(){int st=1;while(empty()){usleep(st);st=min(1000,2*st);}}void push(const T &t){waitFull();queue[end]=t;end=(end+1)%SIZE;}bool pop(T &t){if(empty()) return false;t=queue[begin];begin=(begin+1)%SIZE;return true;}T pop(){T t;return pop(t);}};template<class T ,int SIZE=1024>class LockedQueue{Circular<T,SIZE+1> cq;pthread_mutex_t mutex;public:LockedQueue(){cq.begin=0;cq.end=0;pthread_mutex_init(&mutex,NULL);}~LockedQueue(){pthread_mutex_destroy(&mutex);}void push(const T &t){pthread_mutex_lock(&mutex);cq.push(t);pthread_mutex_unlock(&mutex);}bool pop(T &t){pthread_mutex_lock(&mutex);bool bp=cq.pop(t);pthread_mutex_unlock(&mutex);if(!bp) return false;return true;}T pop(){T t;pop(t);return t;}};void *produce_function(void *arg){LockedQueue<int,1024>*flq=(LockedQueue<int,1024>*)arg;int i=0;while(i<10){i++;flq->push(i);cout<<"product:  "<<i<<endl;sleep(1);}}void *consume_function(void *arg){LockedQueue<int,1024> *flq=(LockedQueue<int,1024>*)arg;while(1){int a=0;sleep(2);if(flq->pop(a))cout<<"consume :"<<a<<endl;elsecout<<"queue  empty !"<<endl;if(a>=10)break;}}int main(){pthread_t thread1,thread2;LockedQueue<int,1024> lq;pthread_create(&thread1,NULL,produce_function,&lq);pthread_create(&thread2,NULL,consume_function,&lq);pthread_join(thread1,NULL);pthread_join(thread2,NULL);return 0;}



grep(global search regular expression and print out the line),全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它

能使用正则 表达式搜索文本,并把匹配的行打印出来

grep常用的用法

[root@www ~]# grep [-acinv] [--color=auto] '搜寻字符串' filename选项与参数:-a :将 binary 文件以 text 文件的方式搜寻数据-c :计算找到 '搜寻字符串' 的次数-i :忽略大小写的不同,所以大小写视为相同-n :顺便输出行号-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!--color=auto :可以将找到的关键词部分加上颜色的显示喔!
比如: 将/etc/passwd,有出现root的行取出来

grep root  /etc/passwd

将/etc/passwd,将没有出现root的行取出来  grep -v root /etc/passwd

将/etc/passwd,将没有出现root和nologin的行取出来   grep -v root /etc/passwd | grep -v nologin

你可以在~/.bashrc内加入这行  alias grep=' grep --color=auto' 在 source ~/.bashrc来立即生效


关键字的前3 用 -A3  后三行 -B3


grep正则表达式

grep -n 't[ae]st'  regular_express.txt  其实[]里面不论有几个字节,它都只代表某一个字节

字符类的反向择 [^] :

行首与行尾字节 ^ $    

[root@www ~]# grep -n '^the' regular_express.txt
如果我想要开头是小写字节的那一行就列出呢?可以这样: 
grep -n '^[a-z]' regular_express.txt

如果我不想要开头是英文字母,则可以是这样:

[root@www ~]# grep -n '^[^a-zA-Z]' regular_express.txt
^ 符号,在字符类符号(括号[])之内与之外是不同的! 在 [] 内代表『反向选择』,在 [] 之外则代表定位在行首的意义!


那如果我想要找出来,行尾结束为小数点 (.) 的那一行:

[root@www ~]# grep -n '\.$' regular_express.txt
,因为小数点具有其他意义(底下会介绍),所以必须要使用转义字符(\)来加以解除其特殊意义!


任意一个字节 . 与重复字节 *

. (小数点):代表『一定有一个任意字节』的意思;* (星号):代表『重复前一个字符, 0 到无穷多次』的意思,为组合形态

『o*』代表的是:『拥有空字节或一个 o 以上的字节』

如果我想要字串开头与结尾都是 g,但是两个 g 之间仅能存在至少一个 o 

[root@www ~]# grep -n 'goo*g' regular_express.txt

如果我想要找出『任意数字』的行?因为仅有数字,所以就成为:

[root@www ~]# grep -n '[0-9][0-9]*' regular_express.txt

限定连续 RE 字符范围 {}

我们可以利用 . 与 RE 字符及 * 来配置 0 个到无限多个重复字节, 那如果我想要限制一个范围区间内的重复字节数呢?

举例来说,我想要找出两个到五个 o 的连续字串,该如何作?这时候就得要使用到限定范围的字符 {} 了。 但因为 { 与 } 的符号在 shell 是有特殊意义的,因此, 我们必须要使用字符   \ 来让他失去特殊意义才行。 至於 {} 的语法是这样的,假设我要找到两个 o 的字串,可以是:

[root@www ~]# grep -n 'o\{2\}' regular_express.txt

假设我们要找出 g 后面接 2 到 5 个 o ,然后再接一个 g 的字串,他会是这样:

[root@www ~]# grep -n 'go\{2,5\}g' regular_express.txt


find 命令:

格式: find pathname -options [-print -exec  -ok]

3.命令参数:

pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。 
-print: find命令将匹配的文件输出到标准输出。 
-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' {  } \;,注意{   }和\;之间的空格。 
-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

命令选项:

3.命令参数:

pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。 
-print: find命令将匹配的文件输出到标准输出。 
-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' {  } \;,注意{   }和\;之间的空格。 
-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。






 

0 0
原创粉丝点击