c语言多线程运行后为什么值会变成这样

请问为什么运行下列程序后,gCount的值不为5,而是为一个莫名其妙的随机数啊?
如果说是多线程影响的,那毕竟加和减在两个函数里都限定死了为10000000次,那运算结果应该还是为5啊?
整个运行机制到底是怎样的?
求大神解答!

#include
#include
#include

volatile unsigned int gCount=5;
//gCount是全局共享变量,volatile表明不进行优化

unsigned __stdcall FirstThreadFunc(void *pArguments)
{
int i;
for(i=0;i<10000000;i++)
{
gCount=gCount+1;
}
return 0;
}

unsigned __stdcall SecondThreadFunc(void *pArguments)
{
int i;
for(i=0;i<10000000;i++)
{
gCount=gCount-1;
}
return 0;
}

int main()
{
HANDLE hThread[2];
unsigned threadID[2];

printf("gCount的初始值为%d\n",gCount);

hThread[0]=(HANDLE)_beginthreadex(NULL,0,FirstThreadFunc,NULL,0,&threadID[0]);
hThread[1]=(HANDLE)_beginthreadex(NULL,0,SecondThreadFunc,NULL,0,&threadID[1]);

WaitForSingleObject(hThread[0],INFINITE);
WaitForSingleObject(hThread[1],INFINITE);

CloseHandle(hThread[0]);
CloseHandle(hThread[1]);
printf("并发修改后,gCount的值为%d\n",gCount);

return 0;

}

2个回答

应该是线程安全问题。

//线程
#if 1
#include
#include
#include
using namespace std;

//声明关键段(临界区)
CRITICAL_SECTION g_csNumber;

//gCount是全局共享变量,volatile表明不进行优化
volatile unsigned int gCount = 5;

unsigned __stdcall FirstThreadFunc(void *pArguments)
{
//进入临界区
//g_csNumber的成员OwningThread代表哪个线程
//拥有临界区,如果OwningThread为NULL,
//则当前线程进入临界区
//如果不为空并当和前线程ID
//不相等则等待
EnterCriticalSection(&g_csNumber);

int i;
for (i = 0; i<10000000; i++)
{
    gCount = gCount + 1;
}

//离开临界区
LeaveCriticalSection(&g_csNumber);
Sleep(50);

return 0;

}
unsigned __stdcall SecondThreadFunc(void *pArguments)
{
//进入临界区
//g_csNumber的成员OwningThread代表哪个线程
//拥有临界区,如果OwningThread为NULL,
//则当前线程进入临界区
//如果不为空并当和前线程ID
//不相等则等待
EnterCriticalSection(&g_csNumber);

int i;
for (i = 0; i<10000000; i++)
{
    gCount = gCount - 1;
}

//离开临界区
LeaveCriticalSection(&g_csNumber);
return 0;

}
int main()
{
HANDLE hThread[2];
unsigned threadID[2];
printf("gCount的初始值为%d\n", gCount);

//初始化临界区
InitializeCriticalSection(&g_csNumber);

hThread[0] = (HANDLE)_beginthreadex(NULL, 0, FirstThreadFunc, NULL, 0, &threadID[0]);  //第5个参数,0为运行状态,CREATE_SUSPENDED为挂起状态,阻塞
hThread[1] = (HANDLE)_beginthreadex(NULL, 0, SecondThreadFunc, NULL, 0, &threadID[1]); //第5个参数,0为运行状态,CREATE_SUSPENDED为挂起状态,阻塞

WaitForSingleObject(hThread[0], INFINITE);  //若为零则不等待,也就不会输出子线程函数里面的内容
WaitForSingleObject(hThread[1], INFINITE);  //若为零则不等待,也就不会输出子线程函数里面的内容

CloseHandle(hThread[0]);
CloseHandle(hThread[1]);
printf("并发修改后,gCount的值为%d\n", gCount);

return 0;

}
#endif

以上是我的代码,我加了临界区,保证线程互斥,也就是说在线程一给全局变量加的时候,保证线程二不能够对全局变量进行访问,直到线程一访问完之后,才可以,你还是没有理解多线程问题。

John_ToStr
John_ToDebug 回复WhiteDouglas: 采纳.谢谢
4 年多之前 回复
chenyangsocool
WhiteDouglas 嗯嗯,多谢了!
4 年多之前 回复
chenyangsocool
WhiteDouglas 嗯嗯,多谢了!
4 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
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; } ```

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); } ```

c语言多线程问题,快速创建多个线程!

for(int i=10;i>0;i--) pthread_create(&pid,NULL,doit,NULL); 怎么创建出来的线程ID是重复的啊?应该怎么处理快速创建线程的时候,线程ID会复用?

C语言程序运行之前为什么要经过编译这个阶段,不编译为什么不能运行呢

C语言程序运行之前为什么要经过编译这个阶段,不编译为什么不能运行呢

windows编程C语言,多线程共用一个变量,怎么保证从读取到修改之间,这个变量没有被别的线程改动

如线程 void thread(...){ while(1){ ... result=calculate(); if(result>GloBestResult){ GloBestResult=result; } } } 建立多个线程加快速度,但是如GloBestResult=1, 线程a和b计算的result分别为2和3匀大于GloBestResult,而b线先改动GloBestReult 然后轮到线程a,那3这个结果就被覆盖了。 怎么解决,加入信号量吗?会不会杀鸡用宰牛刀了,毕竟冲突的情况是极少数,信号量申请那可是上百万次。 不太想分别统计各个线程的BestResult最后再汇总到GloBestResult

关于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

多线程同步问题,向大家请教~

是这样,主线程是处理使用各传感器的数据,从线程是对数据进行预处理。 程序形式为: 主线程: while(1) { Sleep(100); send_frame(a,b); } 辅线程: while(1) { //各种处理 a=XXX; b=XXX; } 辅线程中的a、b都是在不断变的,并且辅线程计算量较大 现发现在主线程中接收的辅线程数据有较大延时,将辅线程处理过程单独写为一个程序可以在1ms内就计算完成,此处多线程程序应如何处理

请大家帮帮萌新 为什么C语言运行中文会乱码?

自学C语言初学者 1.不知道为什么这个程序运行中文会乱码(用的gcc) #include<stdio.h> int main() { printf("万丈高楼平地起"); getch(); return 0; } 2.明明有这个getch();为何窗口不暂停

linux c语言pthread线程结束问题

主线程调用pthread__create 创建的新线程,新线程使用while(true)死循环执行动作,当执行该动作的条件不满足时,如果结束新创建的线程。

求帮助!C语言有个输出线程无法执行

/*创建线程1:读入请求 */ DWORD ThreadID = 1; //创建线程(对应于函数getInput()),用于接收电梯输入; HANDLE hRead =CreateThread(NULL,0(LPTHREAD_START_ROUTINE)getInput,NULL,0,&ThreadID); DWORD ThreadID2=2;//输出线程 HANDLE hRead2=CreateThread(NULL,0(LPTHREAD_START_ROUTINE)print,NULL,0,&ThreadID2); //打印结果的函数 void print(void) { //time_count(5); //printf("hHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHh\a"); if(IS_OUTPUT==1) { int i,j; char c; if((STATE_OUTPUT_FILE=fopen("d:\\state_output_file.txt","a+"))==NULL)//打开文件2,state_output_file.txt {//要写入的时候才打开文件,否则会出错,stream!=NULL printf("\nCannot open file strike any key exit!"); getch(); exit(1); } system("color 2f"); hConsole = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(hConsole, FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY); //打印楼层信息 gotoxy(20,10);//控制光标位置,每次只改变要输出的内容 printf("%d", current_floor+up_count+down_count);//都需要加上默认的偏移楼层 fputs("电梯的当前楼层为: ",STATE_OUTPUT_FILE);//将电梯状态读入文件STATE_OUTPUT_FILE中 c=(current_floor+up_count+down_count)+48; fputc(c,STATE_OUTPUT_FILE); fputs("\n",STATE_OUTPUT_FILE); //打印目标楼层 gotoxy(20,12); if(state!=IDLE&&state!=STOP)//电梯处于运行中,有目标楼层 { printf("%d ",dest_floor); fputs("电梯的目标楼层为: ",STATE_OUTPUT_FILE);//将电梯状态读入文件STATE_OUTPUT_FILE中 fputc(dest_floor+48,STATE_OUTPUT_FILE); fputs("\n",STATE_OUTPUT_FILE); } else { printf("无"); fputs("电梯的目标楼层为: 无\n",STATE_OUTPUT_FILE);//将电梯状态读入文件STATE_OUTPUT_FILE中 } //打印电梯的运行方向 gotoxy(20,14); if(direction==NONE)//处于闲置时 { printf("没有"); fputs("电梯的运行方向为: 无\n",STATE_OUTPUT_FILE);//将电梯状态读入文件STATE_OUTPUT_FILE中 } else if(state==RUN)//处于运行时 if(direction == UP) { printf("向上"); fputs("电梯的运行方向为: 上\n",STATE_OUTPUT_FILE);//将电梯状态读入文件STATE_OUTPUT_FILE中 } else { printf("向下"); fputs("电梯的运行方向为: 下\n",STATE_OUTPUT_FILE);//将电梯状态读入文件STATE_OUTPUT_FILE中 } else { printf("没有"); fputs("电梯的运行方向为: 无\n",STATE_OUTPUT_FILE);//将电梯状态读入文件STATE_OUTPUT_FILE中 } //打印电梯的状态 gotoxy(20,16); if(state==RUN) //处于运行时 { printf("RUN "); fputs("电梯的运行状态为: RUN\n",STATE_OUTPUT_FILE);//将电梯状态读入文件STATE_OUTPUT_FILE中 } else if(state==IDLE) { printf("IDLE"); fputs("电梯的运行状态为:IDLE\n",STATE_OUTPUT_FILE);//将电梯状态读入文件STATE_OUTPUT_FILE中 } else { printf("STOP"); fputs("电梯的运行状态为: STOP\n",STATE_OUTPUT_FILE);//将电梯状态读入文件STATE_OUTPUT_FILE中 } //打印内部未响应楼层数 gotoxy(54,10); fputs("电梯的内部未响应楼层为: ",STATE_OUTPUT_FILE);//将电梯状态读入文件STATE_OUTPUT_FILE中 for(i=1,j=0;i<10;i++) { if(inside[i]!=0) { printf("%d ",i); fputc(i+48,STATE_OUTPUT_FILE); j++; } } if(j==0) { printf("无"); fputs("无",STATE_OUTPUT_FILE); for(i=1;i<9;i++) printf(" "); } else { for(i=1;i<=9-j;i++) printf(" "); } fputc('\n',STATE_OUTPUT_FILE); //overweight(j); //打印外部未响应楼层数 //外部向上 fputs("电梯的外部未响应楼层为: ",STATE_OUTPUT_FILE);//将电梯状态读入文件STATE_OUTPUT_FILE中 gotoxy(54,12); for(i=1,j=0;i<10;i++) { if(outside_up[i]!=0) { printf("%d ",i); fputc(i+48,STATE_OUTPUT_FILE); j++; } } if(j==0) { printf("无"); fputs("无",STATE_OUTPUT_FILE); for(i=1;i<9;i++) printf(" "); } else { for(i=1;i<=9-j;i++) printf(" "); } // 外部向下 gotoxy(54,14); for(i=1,j=0;i<10;i++) { if(outside_down[i]!=0) { printf("%d ",i); j++; } } if(j==0) { printf("无"); for(i=1;i<9;i++) printf(" "); } else { for(i=1;i<=9-j;i++) printf(" "); } fputc('\n',STATE_OUTPUT_FILE);//??? // 系统时间 gotoxy(54,16); printf(" "); gotoxy(54,16); total_finish=clock(); //fputs("系统已经运行的时间: ",STATE_OUTPUT_FILE); printf("%d",(total_finish-total_start)/1000); //fputc((total_finish-total_start)/1000+48,STATE_OUTPUT_FILE); fputs("\n\n\n",STATE_OUTPUT_FILE); //该层时间 gotoxy(54,18); printf(" "); gotoxy(54,18); time2=clock(); printf("%d",(time2-time1)/1000); time1=clock(); //当前服务策略 gotoxy(20,20) ; if(change_running_strategy==1) { printf("先来先服务"); } else if(change_running_strategy==2) { printf("顺便服务"); } //坐标归位 gotoxy(0,22); printf("\n"); //fflush(STATE_OUTPUT_FILE); //确保不关闭文件情况下数据能写入 fclose(STATE_OUTPUT_FILE); } }

嵌入式多线程开发,多线程共享数据什么时候需要使用volatile?

一般我们在多线程开发过程中,多个线程共享的全局变量或数据的时候都需要加互斥锁或者用信号量同步。 但是有的时候编译器还会优化的,例如写一个变量的时候,可能没有写到内存中,只是写在了本地的寄存器中, 这样多线程的时候一个线程修改了一个变量,另一个线程可能是不知道的,所以我认为多线程共享的全局变量应该使用volatile声明才安全。 但是在实际开发当中,很少看到多线程全局共享变量加volatile。不知道这样可以保证系统安全吗?

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 多线程设定了每个线程的栈大小,程序运行后会出现直接系统死机现象

现在怀疑某一个线程的栈不够用,有什么办法可以获取到每个线程对栈的最大使用情况(死机时不会生成core文件,以确认在将大量局部变量清理后程序可以正常运行)

请问C语言是怎么运行的?

大家好,请问C语言是怎么运行的呀?我 是菜鸟一个,想学C语言,哪个高手帮忙解决?需要什么编译器?怎么搭建环境?

我的c语言程序怎么正常运行?

c语言,我在bing上没搜到过类似的问题,问题:怎么能让小黑框里接受我输入的多个数?(我在cfree5,codeblock上运行,都是一样的问题)如图:![图片说明](https://img-ask.csdn.net/upload/201909/27/1569592969_289164.png)(只有第一个数字是正常的,另外都不对)(环境是软件自己配的)

c语言单线程开启多个定时器,同时去读写同一个文件,需要加锁吗?定时器原理?

同一线程,但是有多个定时器,假设有好多定时器,那么理论上会有多个定时器几乎同时到时,这种情况,操作系统怎么处理,是肯定等待目前这个定时器执行结束才去执行下一个定时器还是怎么样?

相同的程序C语言程序每次运行结果不一样,为什么?

原码如下: #include<stdio.h> main() { int k=0,*ps,s[11]={0,1,2,3,4,5,6,7,8,9,10}; for(ps=&s[6];*ps!=0;ps++) k+=*ps; printf("%d\n",k); } 求问为啥?

如何使用C语言 对一个很大的文本文件 多线程查找某个特定单词出现的次数

如题,实在是新手,不知道如何分割一个大文件,也不知道如何使用多线程进行查找

多线程间,变量可见性问题。一个线程会永远看不到另一个线程的更新吗?

作者说,由于读线程可能永远发现不了main对ready变量的修改就会永远循环下去,但是貌似不太可能永远读不到main对ready变量修改之后的值吧,可能会由于从栈区复制回堆区时,有几毫秒的误差,read线程读到的是旧值,但堆区值更新之后,read线程就读到了新值了吧,为什么说会永远循环下去呢?![图片说明](https://img-ask.csdn.net/upload/201603/15/1458021452_370076.png)

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

总结了 150 余个神奇网站,你不来瞅瞅吗?

原博客再更新,可能就没了,之后将持续更新本篇博客。

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

外包程序员的幸福生活

今天给你们讲述一个外包程序员的幸福生活。男主是Z哥,不是在外包公司上班的那种,是一名自由职业者,接外包项目自己干。接下来讲的都是真人真事。 先给大家介绍一下男主,Z哥,老程序员,是我十多年前的老同事,技术大牛,当过CTO,也创过业。因为我俩都爱好喝酒、踢球,再加上住的距离不算远,所以一直也断断续续的联系着,我对Z哥的状况也有大概了解。 Z哥几年前创业失败,后来他开始干起了外包,利用自己的技术能...

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

深入剖析Springboot启动原理的底层源码,再也不怕面试官问了!

大家现在应该都对Springboot很熟悉,但是你对他的启动原理了解吗?

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

2020阿里全球数学大赛:3万名高手、4道题、2天2夜未交卷

阿里巴巴全球数学竞赛( Alibaba Global Mathematics Competition)由马云发起,由中国科学技术协会、阿里巴巴基金会、阿里巴巴达摩院共同举办。大赛不设报名门槛,全世界爱好数学的人都可参与,不论是否出身数学专业、是否投身数学研究。 2020年阿里巴巴达摩院邀请北京大学、剑桥大学、浙江大学等高校的顶尖数学教师组建了出题组。中科院院士、美国艺术与科学院院士、北京国际数学...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

你期望月薪4万,出门右拐,不送,这几个点,你也就是个初级的水平

先来看几个问题通过注解的方式注入依赖对象,介绍一下你知道的几种方式@Autowired和@Resource有何区别说一下@Autowired查找候选者的...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

《Oracle Java SE编程自学与面试指南》最佳学习路线图2020年最新版(进大厂必备)

正确选择比瞎努力更重要!

《Oracle Java SE编程自学与面试指南》最佳学习路线图(2020最新版)

正确选择比瞎努力更重要!

字节跳动面试官竟然问了我JDBC?

轻松等回家通知

面试官:你连SSO都不懂,就别来面试了

大厂竟然要考我SSO,卧槽。

终于,月薪过5万了!

来看几个问题想不想月薪超过5万?想不想进入公司架构组?想不想成为项目组的负责人?想不想成为spring的高手,超越99%的对手?那么本文内容是你必须要掌握的。本文主要详解bean的生命...

自从喜欢上了B站这12个UP主,我越来越觉得自己是个废柴了!

不怕告诉你,我自从喜欢上了这12个UP主,哔哩哔哩成为了我手机上最耗电的软件,几乎每天都会看,可是吧,看的越多,我就越觉得自己是个废柴,唉,老天不公啊,不信你看看…… 间接性踌躇满志,持续性混吃等死,都是因为你们……但是,自己的学习力在慢慢变强,这是不容忽视的,推荐给你们! 都说B站是个宝,可是有人不会挖啊,没事,今天咱挖好的送你一箩筐,首先啊,我在B站上最喜欢看这个家伙的视频了,为啥 ,咱撇...

立即提问
相关内容推荐