C语言线程控制的程序设计

编写一个程开启3个线程,的ID分别为A、B、C每个线程将自己的ID在线程上打印出来10遍,要求输出结果按照ABC的顺序显示:
如:ABCABC....依次递推

6个回答

用一个互斥锁加三条件变量就好了啊,首先初始化时设置A条件,A执行打印后设置B条件,B执行打印后设置C条件,C执行打印后设置A条件这样循环.........

这个题目的考察点是如何保护共用数据吧,给数据加好锁就OK了

用3个互斥,在线程里等待条件成立,然后执行动作

加互斥,否则顺序不能控制

a打印的时候bc阻塞么?完后b,完后c

这个有详细的代码可供参考的吗

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
c语言线程池关于空闲线程队列的疑问?
一般的线程池都会有任务队列、繁忙线程队列和空闲线程队列。这些队列的具体作用是什么呢?我觉得没有这些队列也是可以实现线程池的。 我认为这些队列在线程池中的一个主要作用就是:用于控制线程个数,当空闲线程队列个数低于最小值时需要创建新线程,当空闲线程队列个数高于某个最大值时需要减少线程个数。而这些不用空闲线程队列用计数也是可以做到的,当有空闲线程时计数就+1,然后如果这个数值低于最小值时就创建新线程。
linux C/C++ 多线程编程开启线程的方式
在网上查阅资料的时候,看到关于开启线程的方式有很多种, windows平台和linux平台各不相同, 比如说linux下会用到pthread, 我的问题是,C++标准里面不是提供了标准线程库std::thread,为什么不使用它,以便于跨平台编程呢? 恳请各位指教!
c++11 线程池,子线程的运行导致同时运行的父线程的代码块耗时增加
copy了Github上一段c++11线程池的代码,看着很多人用<br> https://github.com/progschj/ThreadPool<br> <br> cpu: i5-8500桌面版<br> <br> 本意是想使用子线程去做一个大块内存的memset工作,主线程做计算,使得计算和内存初始化异步执行<br> <br> 但是现在将memset的任务分给一个子线程后(即将memset任务添加到线程池的任务队列里面),紧接着的主线程代码耗时就会增加(增加非常明显,且这段代码不访问正在子线程初始化的的内存块),如果不使用子线程,或则等待子线程计算完再开始主线程的计算,就没有这个问题。<br> <br> 问题太大,导致多线程比单线程还慢<br> <br> 考虑过是不是cache竞争的问题,我打印了主线程和子线程分配的cpu,两个线程不在同一个cpu上面,而且我的cpu没有共用L1Cache,感觉可以排除L1dcache竞争的问题
linux c语言pthread线程结束问题
主线程调用pthread__create 创建的新线程,新线程使用while(true)死循环执行动作,当执行该动作的条件不满足时,如果结束新创建的线程。
c语言多线程问题,快速创建多个线程!
for(int i=10;i>0;i--) pthread_create(&pid,NULL,doit,NULL); 怎么创建出来的线程ID是重复的啊?应该怎么处理快速创建线程的时候,线程ID会复用?
C语言写的一个实时时间小程序,用的多线程屏幕问题
这是一个子程序,我想把这个调试好了加到另一个工程里,因为要实时显示时间,所以用到了多线程,现在的问题是子线程执行的时候 光标就移动到这行后面,主线程再打印什么东西的时候,屏幕显示就乱套了,怎么能解决啊,下面是代码片段。 ``` void real_time(int X,int Y) //显示时间的函数,用到了光标移动函数,X,Y表示坐标 { HideCursor(10, 0); //隐藏光标函数 hout = GetStdHandle(STD_OUTPUT_HANDLE); struct tm *ptr; ptr = Time(); SetCur(X, Y); //这个函数没贴出,用于移动光标 printf("%d-%d-%d ", ptr->tm_year + 1900, ptr->tm_mon + 1, ptr->tm_mday); printf("%02d:", ptr->tm_hour); printf("%02d:", ptr->tm_min); while (1) { ptr = Time(); if (ptr->tm_min == 0) { SetCur(X+10, Y); printf("%02d:%02d:%02d", ptr->tm_hour, ptr->tm_min, ptr->tm_sec); continue; } else { if (ptr->tm_sec == 0) { SetCur(X+13, Y); printf("%02d:%02d", ptr->tm_min, ptr->tm_sec); continue; } else { SetCur(X+16, Y); //秒要变化,这里移动光标实现覆盖 printf("%02d", ptr->tm_sec); } } } } ``` ``` DWORD WINAPI ThreadProc1(LPVOID lpParam) //子线程 { real_time(0,1); //在第二行打印时间 return 0; } ``` ``` void main() { system("title 实时时间"); CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL); //创建线程 printf("\n\n\n"); //这里即使换行,最后的内容 printf("输入序号:"); //下面的代码只是模拟其他线程的操作 int k; SetCur(0, 4); //即使设置光标到第5行,控制台窗口打印出的依然在子线程后面 scanf("%d", &k); char ch = getchar(); ············ ············ } ``` 正常执行后这样 ![正常执行后这样](https://img-ask.csdn.net/upload/201508/19/1439983378_846765.png) 输入0后,0显示在秒的后面! ![输入0后,0显示在秒的后面!](https://img-ask.csdn.net/upload/201508/19/1439983434_323691.png) 怎么能让他不受子线程的影响
关于linux c语言多线程编程的问题
/* 以生产者和消费者模型问题来阐述Linux线程的控制和通信你 生产者线程将生产的产品送入缓冲区,消费者线程则从中取出产品。 缓冲区有N个,是一个环形的缓冲池。 */ #include <stdio.h> #include <pthread.h> #define BUFFER_SIZE 16 struct prodcons { int buffer[BUFFER_SIZE];/*实际存放数据的数组*/ pthread_mutex_t lock;/*互斥体lock,用于对缓冲区的互斥操作*/ int readpos,writepos; /*读写指针*/ pthread_cond_t notempty;/*缓冲区非空的条件变量*/ pthread_cond_t notfull;/*缓冲区未满 的条件变量*/ }; /*初始化缓冲区*/ void pthread_init( struct prodcons *p) { pthread_mutex_init(&p->lock,NULL); pthread_cond_init(&p->notempty,NULL); pthread_cond_init(&p->notfull,NULL); p->readpos = 0; p->writepos = 0; } /*将产品放入缓冲区,这里是存入一个整数*/ void put(struct prodcons *p,int data) { pthread_mutex_lock(&p->lock); /*等待缓冲区未满*/ if((p->writepos +1)%BUFFER_SIZE ==p->readpos) { pthread_cond_wait(&p->notfull,&p->lock); } p->buffer[p->writepos] =data; p->writepos++; if(p->writepos >= BUFFER_SIZE) p->writepos = 0; pthread_cond_signal(&p->notempty); pthread_mutex_unlock(&p->lock); } /*从缓冲区取出整数*/ int get(struct prodcons *p) { int data; pthread_mutex_lock(&p->lock); /*等待缓冲区非空*/ if(p->writepos == p->readpos) { pthread_cond_wait(&p->notempty ,&p->lock);//非空就设置条件变量notempty } /*读书据,移动读指针*/ data = p->buffer[p->readpos]; p->readpos++; if(p->readpos == BUFFER_SIZE) p->readpos = 0; /*设置缓冲区未满的条件变量*/ pthread_cond_signal(&p->notfull); pthread_mutex_unlock(&p->lock); return data; } /*测试:生产站线程将1 到1000的整数送入缓冲区,消费者线程从缓冲区中获取整数,两者都打印信息*/ #define OVER (-1) struct prodcons buffer; void *producer(void *data) { int n; for( n=0;n<1000;n++) { printf("%d ------>\n",n); put(&buffer,n); } put(&buffer,OVER); return NULL; } void *consumer(void *data) { int d; while(1) { d = get(&buffer); if(d == OVER) break; else printf("----->%d\n",d); } return NULL; } int main() { pthread_t th_p,th_c; void *retval; pthread_init(&buffer); pthread_create(&th_p,NULL,producer,0); pthread_create(&th_c,NULL,consumer,0); /*等待两个线程结束*/ pthread_join(th_p, &retval); pthread_join(th_c,&retval); return 0; } 这段代码是我从网上下载的代码 问题是 main函数中没有声明结构体变量 也没有全局结构体变量 那么main函数为什么可以直接使用buffer
C语言多线程传参数时,线程里的参数值一直没变?
我想用C实现一个多线程的端口扫描,对每个ip都创建100个线程; 在main里for循环中创建线程,打印出来的参数(arg->min_port,arg->max_port)是没问题的, 但是在线程函数里打印出传进去的参数时,min_port与max_port都是一样的,请问该怎么解决? 谢谢 ``` #include <stdio.h> #include <unistd.h> #include <sys/socket.h> #include <string.h> #include <netdb.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <pthread.h> #define THREAD_NUM 100 #define MAX_PORT 65535 #define SEG_LEN 649 struct port_seg { char *dest; int min_port; int max_port; }; typedef struct port_seg port_segment; void * scan(void * arg) { struct port_seg * parg; int min_port; int max_port; int sockfd; struct sockaddr_in server; int length; int ret; struct servent* result; parg = (struct port_seg *)arg; min_port = parg->min_port; max_port = parg->max_port; printf("ip:%s\n",parg->dest); printf("min_port:%d\n",min_port); printf("max:%d\n",max_port); if (-1==(sockfd=socket(AF_INET,SOCK_STREAM,0))) { perror("generating socket error\n"); exit(1); } memset(&server,0,sizeof(struct sockaddr_in)); server.sin_family = AF_INET; server.sin_addr.s_addr = inet_addr(parg->dest); length = sizeof(struct sockaddr); for(int i=min_port;i<=max_port;i++) { server.sin_port = htons(i); if(0>(ret=connect(sockfd,(struct aockaddr*)&server,length))) { //perror("connect err\n"); continue; } else { if(NULL == (result = getservbyport(server.sin_port,"tcp"))) { continue; } else { printf(">>> ip:%s, name:%s, s_port:%d\n", parg->dest, result->s_name,ntohs(result->s_port)); } } close(sockfd); } close(sockfd); exit(0); } int main(int argc, char** argv) { pthread_t * thread; thread = (pthread_t *)malloc(THREAD_NUM * sizeof(pthread_t)); if(argc<1) { printf("./portscanner ip1, ip2, ……"); exit(1); } for(int i=1; i<argc; i++) { // each group for(int j=0;j<THREAD_NUM;j++) { // printf("j:%d ",j); port_segment port; port.dest = argv[i]; port.min_port = j*SEG_LEN+1; if(j == THREAD_NUM - 1) { port.max_port = MAX_PORT; } else { port.max_port = port.min_port + SEG_LEN -1; } // printf("min:%d\n",port.min_port); // printf("max:%d\n",port.max_port); if ( pthread_create(&thread[j], NULL, scan, (void *)&port) != 0 ) { perror( "pthread_create failed\n" ); free(thread); exit(1); } } } exit(0); } ```
多线程程序设计,访问数据库
现遇到项目中的一个问题,一个多线程,每3秒钟执行一次,执行查询数据,数据是集合list形式,然后在线程体力循环遍历list,再根据遍历的list数据再查询另外一张表a数据插入到表b中,list集合数据不确定是多少条,这样的程序怎么设计或使用那种模式最为妥当。谢谢各位大神指点。
c# 如何在主线程中调用次线程的方法?
一个解决方案,包含两个项目a和b,项目a是启动项,项目a引用了项目b,在a线程运行时会触发b线程运行,当a运行起来后,b也在运行,这时 如何在 整个程序都运行起来后,在a线程中调用b线程的方法。 比如 b线程中有一个按钮组件c,默认按钮c背景色是蓝色,a线程的窗体会引用b线程的窗体,将b中的按钮显示出来。当a线程运行后,显示的按钮c就是蓝色,我想从a中改变b窗体的按钮c的背景色为红色,这个时候怎么调用b中的改变按钮c背景色的方法呢
使用phtread多线程编程程序来生成Fibonacci序列 c/c++
请用c/c++实现以下内容:(多线程) Fibonacci序列是一组:0,1,1,2,3,5,8,…… fib0=0; fib1=1; fibn=fibn-1+fibn-2; 使用phtread多线程编程程序来生成Fibonacci序列。程序应该这样工作:用户运行程序时,在命令行输入要产生Fibonaci序列数,然后程序创建一个新的线程来产生Fibonacci数,把这个序列放到线程共享的数据中(数组可能是一种最方便的数据结构)。当线程执行完成后,父线程将输出子线程产生的序列。由于在子线程结束前,父线程不能开始输出Fibonacci序列,因此,父线程需要等子线程结束。
DeferredResult和多线程开发有什么区别?分别的使用场景?DeferredResult需不需要和线程池配合使用?
DeferredResult和多线程开发有什么区别?分别的使用场景?DeferredResult需不需要和线程池配合使用?
java怎样捕获其他线程的异常
现在有个问题,我这边调用一个方法,这个方法是封装好的,我没法修改,方法里面会创建线程池异步执行,但是有个问题,由于线程池中执行的线程和我调用方法的线程不是同一个,导致一旦出现了异常我没法抓到,这个咋办呢?
求问,使用多线程模拟七色球的开奖程序(不需用用到图形化工具,只用控制台输出)
1,通过实现Runnable接口的方式 2,使用数组 ``` String[] color=new String[]{"红","橙","黄","绿","青","蓝","紫"}; ``` 3,使用start()方法启动线程,每次运行生成七个不同的颜色输出
C#后台程序问题 线程 问题
C#后台控制程序 我遇到的问题 : 是 建立 一个线程 ,其线程功能 :与其(我已经设置好的条件)进行匹配 从而输出false or true; 如果为true,我想让线程 睡眠一段时间,再进行终止, 我的想法 : 是打算 建立 另一个线程 首先 定义一个bool v 全局变量, 通过v的值进行操作,如果为true; 想让线程1 睡眠一段时间,再进行终止.(想让线程 睡眠一段时间,再进行终止). 我实现不了,请问 老师们 这可以实现吗,还有别的方法没
C语言多线程运行时间计算问题
如题。计算着两个线程执行的总时间,如何计算。 ``` #include <stdio.h> #include <stdlib.h> #include <pthread.h> int x; pthread_mutex_t mutex; void thread1(void) { while(x>0) { pthread_mutex_lock(&mutex); printf("Thread 1 is running x=%d/n",x); x--; pthread_mutex_unlock(&mutex); sleep(1); } pthread_exit(NULL); } void thread2(void) { while(x>0) { pthread_mutex_lock(&mutex); printf("Thread 2 is running x=%d/n",x); x--; pthread_mutex_unlock(&mutex); sleep(1); } pthread_exit(NULL); } int main() { pthread_t id1,id2; int ret; ret = pthread_mutex_init(&mutex,NULL); if(ret!=0) { printf("pthread_mutex_init error/n"); exit(0); } x=10; ret = pthread_create(&id1,NULL,(void *)thread1,NULL); if(ret!=0) { printf("Create pthread 1 error/n"); exit(0); } ret = pthread_create(&id2,NULL,(void *)thread2,NULL); if(ret!=0) { printf("Create pthread 2 error/n"); exit(0); } pthread_join(id1,NULL); pthread_join(id2,NULL); printf("Done/n"); return 0; } ```
java多线程的程序设计
阅读和修改一个球的代码程序,完成多球的功能: Write a program that bounces balls inside a panel.The ball should begin moving with a mousePressed event. When user clocks the mouse, a ball should be added. When balls hits the edge of the panel,it should bounde off the edge and continue in the opposite direction. The ball location should be updated using Runnable. GUI as follows:![图片说明](https://img-ask.csdn.net/upload/201805/22/1526957953_416827.png) 程序如下: import java.util.Random; public class Ball implements Runnable { private int x; // horizontal position of ball private int y; // vertical position of ball private int dx; // change in horizontal position of ball private int dy; // change in vertical position of ball private final int MAX_X = 200; // horizontal edge of JPanel private final int MAX_Y = 200; // vertical edge of JPanel private static final Random generator = new Random(); public Ball(int xPos, int yPos) { dx = generator.nextInt(5) + 1; // change in x (1-5 pixels) dy = generator.nextInt(5) + 1; // change in y (1-5 pixels) x = xPos; // set ball to horizontal position of mouse press y = yPos; // set ball to vertical position of mouse press } // bounces ball perpetually until window is closed public void run() { while (true) {// infinite loop { try { Thread.sleep(20); // sleep for 20 milliseconds } // process InterruptedException during sleep catch (InterruptedException exception) { exception.printStackTrace(); } x += dx; // determine new x-position y += dy; // determine new y-position // if bounce off top or bottom of JPanel if (y <= 0 || y >= MAX_Y - 10) { dy = -dy; // reverse velocity in y direction } // if bounce off left or right of JPanel if (x <= 0 || x >= MAX_X - 10) { dx = -dx; // reverse velocity in x direction } } } // get horizontal position of ball public int getX() { return x; // return x value } // get vertical position of ball public int getY() { return y; // return y value } } import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.MouseAdapter; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javax.swing.JPanel; import javax.swing.JFrame; public class BallPanel extends JPanel { private Ball blueBall; // bouncing ball private ExecutorService threadExecutor; // for running Ball runnable private JFrame parentWindow; // parent window of JPanel private final int MAX_X = 200; // horizontal edge of JPanel private final int MAX_Y = 200; // vertical edge of JPanel public BallPanel(JFrame window) { parentWindow = window; // set parent window of JPanel // create ExecutorService for running ball runnable threadExecutor = Executors.newCachedThreadPool(); // anonymous inner class handles mouse events this.addMouseListener( new MouseAdapter() { public void mousePressed(MouseEvent event) { createBall(event); // delegate call to ball starter RepaintTimer timer = new RepaintTimer(parentWindow); threadExecutor.execute(timer); } } ); } // create a ball if no ball exists and set it in motion private void createBall(MouseEvent event) { if (blueBall == null) {// if no ball exists { int x = event.getX(); // get x position of mouse press int y = event.getY(); // get y position of mouse press blueBall = new Ball(x, y); // create new ball threadExecutor.execute(blueBall); // set ball in motion } } // return minimum size of animation public Dimension getMinimumSize() { return getPreferredSize(); } // return preferred size of animation public Dimension getPreferredSize() { return new Dimension(MAX_X, MAX_Y); } // draw ball at current position public void paintComponent(Graphics g) { super.paintComponent(g); if (blueBall != null) {// if ball exists { g.setColor(Color.blue); // set color to blue g.fillOval(blueBall.getX(), blueBall.getY(), 10, 10); // draws } } } import javax.swing.JFrame; public class BouncingBall extends JFrame { private final BallPanel ballCanvas; // JPanel in which ball bounces public BouncingBall() { ballCanvas = new BallPanel(this); // create new BallPanel add(ballCanvas); // add BallPanel to JFrame pack(); // make window just large enough for its GUI setVisible(true); // show window } public static void main(String args[]) { BouncingBall application = new BouncingBall(); application.setDefaultCloseOperation(EXIT_ON_CLOSE); } } import javax.swing.JFrame; public class RepaintTimer implements Runnable { private final JFrame repaintComponent; public RepaintTimer(JFrame frame) { // specify component to be repainted repaintComponent = frame; } public void run() { while (true) { try { Thread.sleep(20); } catch (InterruptedException ex) { ex.printStackTrace(); } repaintComponent.repaint(); // repaint the component } } }
Python多线程通信问题
新人第一次提问, 最近在学习Python多线程, notify()与wait()语句。这是我写的一个作业, 要求是: 现在的你,是一个农场主。农场中养着10头小牛,牛吃草长大,但只有当下雨的时候草才会长大,每天有20%的概率下雨,草经过3次成长后就可以喂给牛吃了。每头小牛吃过5次草之后就会长大了。要求使用多线程来完成。小牛(消费者)线程和草(生产者)之间需要通信。 以下是我的代码: ``` import threading import random from time import sleep """ 声明全局变量: num_cows: 牛的数量, 整形,十头。 cows: 牛的集合, 列表(数组)。 长度:10 num_grass: 草的数量, 整形,若干。 区间:50-101棵。 为了确保每头牛都可以长大,小草必须至少有50棵。 grass: 草的集合, 列表(数组)。 长度:num_grass initial_stat: 草/牛的初始状态,整形,设置为0。 increment: 用于改变状态的变量,整形,设置为0。 """ # 定义全局变量 num_cows, initial_stat, num_grass = 10, \ 0, \ random.randint(50, 101) cows, grass = [], [] for i in range(num_grass): # 设置草儿数量,初始化每一棵小草状态 grass.append(initial_stat) for i in range(num_cows): # 初始化每一头牛 cows.append(initial_stat) # TODO 草儿生长类 class GrassGrow(threading.Thread): """草成长线程""" # TODO 重写run函数 def run(self): global grass global cows while True: ct.acquire() print("一天过去了...小草会不会生长呢?") grass = rain(grass) # 淋雨的草儿成长一次,数位进一, 呼叫rain函数, 传入参数grass列表 if len(grass) > 0: # 判断还有没有需要生长的草儿 if grassgrow(grass): # 检查草儿,若有一株淋到三次雨,通知牛儿吃草 print("提醒牛儿该吃草了") ct.notify() # 提醒牛儿线程该吃草了 ct.release() print("草线程解锁") sleep(1) print("通知牛儿吃草了") elif len(grass) <= 0: # 如果草儿被吃完了,结束进程 print("草儿被吃光啦") ct.release() # 解锁 break # 退出程序 # TODO 牛儿生长类 class CowGrow(threading.Thread): """牛儿成长线程""" print("start") # TODO 重写run函数 def run(self): print("1") global cows global grass # TODO 随机一头牛吃草 while True: print("2") ct.acquire() print("3") ct.wait() print("4") if grassgrow(grass) and 5 not in cows: print("牛有草能吃了") # 长大的小草中,随机吃掉一株,从草儿列表中移除 index = [] for i in range(len(grass)): if grass[i] >= 3: index.append(i) delete = index[random.randint(0, len(index) - 1)] del grass[delete] cows[random.randint(range(len(cows)))] += 1 # 随机一头牛吃草,状态进1 print("有一头牛把吃了一颗草,现在的牛儿们是:{}".format(cows)) # 判断牛儿中是否有长大的牛儿 elif 5 in cows: # 移除所有已经长大的牛儿 for cow in range(len(cows)): if cows[cow] == 5: del cows[cow] # 判断是不是所有的牛儿都长大了,如果都长大了,结束进程 elif len(cows) == 0: print("所有的牛儿都长大啦") ct.release() break ct.wait() ct.release() # sleep(1) # TODO 下雨函数 def rain(grass_list): """ :param grass_list: 接收 草儿列表作为参数 :return: 返回 新的,淋雨之后的草儿列表 """ # 遍历草列表中的每一株草 rain_probability = random.randint(1, 101) # 每天有20%几率局部下雨。如果未下雨,则所有小草都不会成长。如果下雨了,局部小草会成长。 if rain_probability <= 20: for a_grass in range(len(grass_list)): grass_grow_prob = random.randint(1, 101) if grass_grow_prob <= 50 and 0 <= grass_list[a_grass] <= 2: grass_list[a_grass] += 1 print("今天下雨啦,现在的小草们:{}".format(grass)) print("今天没有下雨,没有小草生长...") return grass_list # TODO 判断草长大函数 def grassgrow(grass_list): """ :param grass_list: 接收 草儿列表作为参数 :return: 返回 若有生长好的小草则返回真,否则为假 """ if 3 not in grass_list: print("目前为止还没有小草生长完成") return False else: print("有小草生长完成了,现在的小草们:{}".format(grass)) return True if __name__ == "__main__": ct = threading.Condition() # 定义线程变量, 用于多线程通信 cow_thread = CowGrow() grass_thread = GrassGrow() cow_thread.start() print("牛等待吃草") grass_thread.start() ``` rain函数用来20%几率下雨, grasgrow函数用来判断有没有草淋了三次雨, 一旦有草淋到三次雨就可以了通知CowGrow线程吃草了。 我的解题思路是: 创建一个列表grass代表草, 一个列表cows代表牛。类GrassGrow中当判断grassgrow函数为真时, 唤醒牛线程。然后随机一头牛吃了一颗草之后,阻塞自己等待。而当我实际运行的时候,牛在一开始被阻塞之后一直没有被唤醒 以下是运行结果: ============================================= start 1 2 3牛等待吃草 一天过去了...小草会不会生长呢? 今天没有下雨,没有小草生长... 目前为止还没有小草生长完成 一天过去了...小草会不会生长呢? 今天下雨啦,现在的小草们:[1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1] 今天没有下雨,没有小草生长... 目前为止还没有小草生长完成 一天过去了...小草会不会生长呢? 今天没有下雨,没有小草生长... 目前为止还没有小草生长完成 一天过去了...小草会不会生长呢? 今天下雨啦,现在的小草们:[1, 1, 1, 0, 0, 2, 1, 1, 1, 2, 0, 0, 1, 1, 2, 1, 2, 2, 1, 0, 1, 1, 0, 1, 2, 1, 0, 2, 1, 1, 0, 1, 2, 1, 1, 0, 1, 0, 2, 1, 2, 2, 2, 0, 0, 2, 1, 2, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 2, 1, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 0, 1, 1, 2, 2, 2, 0, 2, 1, 2, 1, 2, 1, 0, 1, 0, 2, 1, 1, 1, 2, 1, 1, 1] 今天没有下雨,没有小草生长... 目前为止还没有小草生长完成 一天过去了...小草会不会生长呢? 今天下雨啦,现在的小草们:[2, 2, 1, 1, 1, 2, 2, 1, 2, 2, 1, 0, 1, 1, 2, 2, 2, 3, 2, 1, 1, 1, 0, 1, 2, 2, 1, 2, 2, 2, 0, 1, 3, 1, 2, 0, 1, 0, 3, 2, 3, 3, 3, 0, 1, 2, 1, 2, 0, 1, 1, 2, 2, 1, 0, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 2, 3, 1, 2, 2, 1, 3, 2, 1, 1, 2, 3, 2, 2, 1, 2, 1, 3, 1, 2, 2, 1, 1, 0, 3, 2, 2, 1, 3, 2, 2, 1] 今天没有下雨,没有小草生长... 有小草生长完成了,现在的小草们:[2, 2, 1, 1, 1, 2, 2, 1, 2, 2, 1, 0, 1, 1, 2, 2, 2, 3, 2, 1, 1, 1, 0, 1, 2, 2, 1, 2, 2, 2, 0, 1, 3, 1, 2, 0, 1, 0, 3, 2, 3, 3, 3, 0, 1, 2, 1, 2, 0, 1, 1, 2, 2, 1, 0, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 2, 3, 1, 2, 2, 1, 3, 2, 1, 1, 2, 3, 2, 2, 1, 2, 1, 3, 1, 2, 2, 1, 1, 0, 3, 2, 2, 1, 3, 2, 2, 1] 提醒牛儿该吃草了 草线程解锁 通知牛儿吃草了 一天过去了...小草会不会生长呢? ============================================== 可以看到牛只有一开始调用了一次...之后再也没有被唤醒, 而且前几次小草没有sleep就运行了好多次,之后才开始运行sleep,打印"提醒牛儿该吃草了", "草线程解锁", "通知牛儿吃草了"才开始运行。谷歌和本站都查了一些问题,但和我的情况都不太相似。真心像各位请教...拜托了..
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
英特尔不为人知的 B 面
从 PC 时代至今,众人只知在 CPU、GPU、XPU、制程、工艺等战场中,英特尔在与同行硬件芯片制造商们的竞争中杀出重围,且在不断的成长进化中,成为全球知名的半导体公司。殊不知,在「刚硬」的背后,英特尔「柔性」的软件早已经做到了全方位的支持与支撑,并持续发挥独特的生态价值,推动产业合作共赢。 而对于这一不知人知的 B 面,很多人将其称之为英特尔隐形的翅膀,虽低调,但是影响力却不容小觑。 那么,在...
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
白话阿里巴巴Java开发手册高级篇
不久前,阿里巴巴发布了《阿里巴巴Java开发手册》,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结模式,并推广给广大开发人员,来避免研发人员在实践中容易犯的错误,确保最终在大规模协作的项目中达成既定目标。 无独有偶,笔者去年在公司里负责升级和制定研发流程、设计模板、设计标准、代码标准等规范,并在实际工作中进行...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
【图解经典算法题】如何用一行代码解决约瑟夫环问题
约瑟夫环问题算是很经典的题了,估计大家都听说过,然后我就在一次笔试中遇到了,下面我就用 3 种方法来详细讲解一下这道题,最后一种方法学了之后保证让你可以让你装逼。 问题描述:编号为 1-N 的 N 个士兵围坐在一起形成一个圆圈,从编号为 1 的士兵开始依次报数(1,2,3…这样依次报),数到 m 的 士兵会被杀死出列,之后的士兵再从 1 开始报数。直到最后剩下一士兵,求这个士兵的编号。 1、方...
吐血推荐珍藏的Visual Studio Code插件
作为一名Java工程师,由于工作需要,最近一个月一直在写NodeJS,这种经历可以说是一部辛酸史了。好在有神器Visual Studio Code陪伴,让我的这段经历没有更加困难。眼看这段经历要告一段落了,今天就来给大家分享一下我常用的一些VSC的插件。 VSC的插件安装方法很简单,只需要点击左侧最下方的插件栏选项,然后就可以搜索你想要的插件了。 下面我们进入正题 Material Theme ...
如何防止抄袭PCB电路板
目录 1、抄板是什么 2、抄板是否属于侵权 3、如何防止抄板 1、抄板是什么 抄板也叫克隆或仿制,是对设计出来的PCB板进行反向技术研究;目前全新的定义:从狭义上来说,抄板仅指对电子产品电路板PCB文件的提取还原和利用文件进行电路板克隆的过程;从广义上来说,抄板不仅包括对电路板文件提取、电路板克隆、电路板仿制等技术过程,而且包括对电路板文件进行修改(即改板)、对电子产品外形模具进行三维...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
Python 植物大战僵尸代码实现(2):植物卡片选择和种植
这篇文章要介绍的是: - 上方植物卡片栏的实现。 - 点击植物卡片,鼠标切换为植物图片。 - 鼠标移动时,判断当前在哪个方格中,并显示半透明的植物作为提示。
Java世界最常用的工具类库
Apache Commons Apache Commons有很多子项目 Google Guava 参考博客
相关热词 基于c#波形控件 c# 十进制转十六进制 对文件aes加密vc# c#读取栈中所有的值 c# rsa256加密 好 学c# 还是c++ c# 和java的差距 c# curl网络框架 c# https证书请求 c# 中崎
立即提问