Linux系统编程——线程

2023-11-05

Linux系统编程–线程

1.线程概述(与进程的区别及线程的优势)

2.线程创建等待退出

3.线程共享内存空间的代码验证

4.线程同步之互斥量加锁解锁

5.互斥锁限制共享资源的访问

6.什么情况造成死锁

7.线程条件控制实现线程的同步

1.线程概述(与进程的区别及线程的优势)

Linux多线程编程初探 - 峰子_仰望阳光 - 博客园 (cnblogs.com)

线程也有竞争的关系。

2.线程创建等待退出

demo1.c

#include <pthread.h>
#include <stdio.h>

//int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);
void *funs(void *arg)
{
        printf("t1:%ld\npthread is creat\n",(unsigned long)pthread_self());
        printf("parm is %d\n",*((int *)arg));

}
//int pthread_exit(void *rval_ptr);
//int pthread_join(pthread_t thread, void **rval_ptr);
// 返回:若成功返回0,否则返回错误编号
int main()
{

        int ret;
        pthread_t t1;
        int *pret = NULL;
        int parm = 100;
        ret  = pthread_create(&t1,NULL,funs,(void *)&parm); //创建线程
        if(ret == 0){
                printf("creat t1 is success\n");
		
        }
        return 0;
}

运行结果:在这里插入图片描述
编译时需要链上 -lpthread

运行结果与所想不一样(printf(“parm is %d\n”,*((int *)arg));)还没打印就已经结束了,是因为主程序中没有等待返回就已经结束了

demo2.c (返回 int类型)

#include <pthread.h>
#include <stdio.h>

//int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);
void *funs(void *arg)
{
        static int ret =10;  //如果不用static 函数调用结束后就没掉了,会随机返回 
        printf("t1:%ld\npthread is creat\n",(unsigned long)pthread_self());
        printf("parm is %d\n",*((int *)arg));
        pthread_exit((void *)&ret);  //退出线程

}
//int pthread_exit(void *rval_ptr);
//int pthread_join(pthread_t thread, void **rval_ptr);
// 返回:若成功返回0,否则返回错误编号
int main()
{

        int ret;
        pthread_t t1;
        int *pret = NULL;
        int parm = 100;
        ret  = pthread_create(&t1,NULL,funs,(void *)&parm);
        if(ret == 0){
                printf("creat t1 is success\n");

        }
        printf("main:%ld\n",(unsigned long)pthread_self());
        pthread_join(t1,(void **)&pret); //等待线程退出·
    //pthread_join(t1,NULL);//如果对线程的返回值不感兴趣,可以把rval_ptr置为NULL。在这种情况下,调用pthread_join函数将等待指定的线程终止,但并								//不获得线程的终止状态。
        printf("main:t1 qiut:%d\n",*pret); 
        return 0;
}

运行结果:在这里插入图片描述

demo3.c (返回 char 类型)

#include <pthread.h>
#include <stdio.h>

//int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);
void *funs(void *arg)
{
        static char *ret = "funs ret quit!";
        printf("t1:%ld\npthread is creat\n",(unsigned long)pthread_self());
        printf("parm is %d\n",*((int *)arg));
        pthread_exit((void *)ret);

}
//int pthread_exit(void *rval_ptr);
//int pthread_join(pthread_t thread, void **rval_ptr);
// 返回:若成功返回0,否则返回错误编号
int main()
{

        int ret;
        pthread_t t1;
        char *pret = NULL;
        int parm = 100;
        ret  = pthread_create(&t1,NULL,funs,(void *)&parm);
        if(ret == 0){
                printf("creat t1 is success\n");

        }
        printf("main:%ld\n",(unsigned long)pthread_self());
        pthread_join(t1,(void **)&pret);
        printf("main: t1 quit:%s\n",pret);
        return 0;
}

运行结果:在这里插入图片描述

3.线程共享内存空间的运行结果代码验证

demo4.c

#include <pthread.h>
#include <stdio.h>
int data = 0;
//int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);
void *funs(void *arg)
{
	printf("t1:%ld\npthread is creat\n",(unsigned long)pthread_self());
	printf("parm is %d\n",*((int *)arg));
	while(1){
		printf("t1_data:%d\n",data++);
		sleep(1);
        /*
		if(data == 4){				//t1不一定能获得4, 线程间相互竞争,有几率得到4
			pthread_exit(NULL); 	//if data == 4 ;退出t1线程
		}
		*/
	}
}
void *funs2(void *arg)
{
	printf("t2:%ld\npthread is creat\n",(unsigned long)pthread_self());
	printf("parm is %d\n",*((int *)arg));
	while(1){
		printf("t2_data:%d\n",data++);
		sleep(1);
	}
	
}
//int pthread_exit(void *rval_ptr);
//int pthread_join(pthread_t thread, void **rval_ptr);
// 返回:若成功返回0,否则返回错误编号
int main()
{

	int ret;
	pthread_t t1;
	pthread_t t2;
	int *pret = NULL;
	int parm = 100;
	ret  = pthread_create(&t1,NULL,funs,(void *)&parm);
	if(ret == 0){
		printf("creat t1 is success\n");
		
	}
	ret  = pthread_create(&t2,NULL,funs2,(void *)&parm);
	if(ret == 0){
		printf("creat t2 is success\n");
	}
	while(1){
		printf("main_data:%d\n",data++);
		sleep(1);
	}
	pthread_join(t1,NULL);
	pthread_join(t2,NULL);
	return 0;
}

运行结果:在这里插入图片描述

4.线程同步之互斥量加锁解锁

demo5.c

#include <pthread.h>
#include <stdio.h>
int data = 0;
//int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
pthread_mutex_t mutex;//创建锁
//int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);
void *funs(void *arg)
{
	//int pthread_mutex_lock(*pthread_mutex_t mutex);
	pthread_mutex_lock(&mutex);//上锁
	printf("t1:%ld\npthread is creat\n",(unsigned long)pthread_self());
	printf("parm is %d\n",*((int *)arg));
	//int pthread_mutex_unlock(*pthread_mutext_mutex);
	pthread_mutex_unlock(&mutex);//解锁
}
void *funs2(void *arg)
{
	pthread_mutex_lock(&mutex);//上锁
	printf("t2:%ld\npthread is creat\n",(unsigned long)pthread_self());
	printf("parm is %d\n",*((int *)arg));
	pthread_mutex_unlock(&mutex);//解锁
	
}
//int pthread_exit(void *rval_ptr);
//int pthread_join(pthread_t thread, void **rval_ptr);
// 返回:若成功返回0,否则返回错误编号
int main()
{

	int ret;
	pthread_t t1;
	pthread_t t2;
	int *pret = NULL;
	int parm = 100;
    pthread_mutex_init(&mutex, NULL); //锁动态初始化
	ret  = pthread_create(&t1,NULL,funs,(void *)&parm);
	if(ret == 0){
		printf("creat t1 is success\n");
	}
	ret  = pthread_create(&t2,NULL,funs2,(void *)&parm);
	if(ret == 0){
		printf("creat t2 is success\n");
	}
	pthread_join(t1,NULL);
	pthread_join(t2,NULL);
	//int pthread_mutex_destroy(*pthread_mutex_t mutex);
	pthread_mutex_destroy(&mutex);//销毁锁
	return 0;
}

运行结果:在这里插入图片描述

5.互斥锁限制共享资源的访问

demo6.c

#include <pthread.h>
#include <stdio.h>
int data = 0;
//int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
pthread_mutex_t mutex;
//int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);
void *funs(void *arg)
{
	//int pthread_mutex_lock(*pthread_mutex_t mutex);
	pthread_mutex_lock(&mutex);
	printf("t1:%ld\npthread is creat\n",(unsigned long)pthread_self());
	printf("parm is %d\n",*((int *)arg));
	//int pthread_mutex_unlock(*pthread_mutext_mutex);
	while(1){
		printf("t1:%d\n",data++);
		sleep(1);
		if(data == 4){

			pthread_mutex_unlock(&mutex);
			printf("t1 quit====================\n");
			pthread_exit(NULL);
		}
	}
}
/*让t1运行到4结束退出线程,刚开始不确定会是哪个线程先运行,到t2,上锁++后解锁,到t1上锁,等data=4时,解锁退出*/
void *funs2(void *arg)
{
	printf("t2:%ld\npthread is creat\n",(unsigned long)pthread_self());
	printf("parm is %d\n",*((int *)arg));
	while(1){
		printf("t2:%d\n",data);
		pthread_mutex_lock(&mutex);
		data++;
		pthread_mutex_unlock(&mutex);
		sleep(1);
	}
}
//int pthread_exit(void *rval_ptr);
//int pthread_join(pthread_t thread, void **rval_ptr);
// 返回:若成功返回0,否则返回错误编号
int main()
{

	int ret;
	pthread_t t1;
	pthread_t t2;
	int *pret = NULL;
	int parm = 100;
    pthread_mutex_init(&mutex, NULL); //锁动态初始化
	ret  = pthread_create(&t1,NULL,funs,(void *)&parm);
	if(ret == 0){
		printf("creat t1 is success\n");
		
	}
	ret  = pthread_create(&t2,NULL,funs2,(void *)&parm);
	if(ret == 0){
		printf("creat t2 is success\n");
	}
	pthread_join(t1,NULL);
	pthread_join(t2,NULL);
	//int pthread_mutex_destroy(*pthread_mutex_t mutex);
	pthread_mutex_destroy(&mutex);
	return 0;
}

运行结果:在这里插入图片描述

6.什么情况造成死锁

demo7.c

#include <pthread.h>
#include <stdio.h>
int data = 0;
//int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
pthread_mutex_t mutex;
pthread_mutex_t mutex2;
//int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);
void *funs(void *arg)
{
	//int pthread_mutex_lock(*pthread_mutex_t mutex);
	pthread_mutex_lock(&mutex);
	sleep(1);
	pthread_mutex_lock(&mutex2);
	printf("t1:%ld\npthread is creat\n",(unsigned long)pthread_self());
	printf("parm is %d\n",*((int *)arg));
	//int pthread_mutex_unlock(*pthread_mutext_mutex);
	pthread_mutex_unlock(&mutex);
}
void *funs2(void *arg)
{
	pthread_mutex_lock(&mutex);
	sleep(1);
	pthread_mutex_lock(&mutex2);
	printf("t2:%ld\npthread is creat\n",(unsigned long)pthread_self());
	printf("parm is %d\n",*((int *)arg));
	pthread_mutex_unlock(&mutex);
	
}
//int pthread_exit(void *rval_ptr);
//int pthread_join(pthread_t thread, void **rval_ptr);
// 返回:若成功返回0,否则返回错误编号
int main()
{

	int ret;
	pthread_t t1;
	pthread_t t2;
	int *pret = NULL;
	int parm = 100;
    pthread_mutex_init(&mutex, NULL); //锁动态初始化
    pthread_mutex_init(&mutex2, NULL); //锁动态初始化
	ret  = pthread_create(&t1,NULL,funs,(void *)&parm);
	if(ret == 0){
		printf("creat t1 is success\n");
		
	}
	ret  = pthread_create(&t2,NULL,funs2,(void *)&parm);
	if(ret == 0){
		printf("creat t2 is success\n");
	}
	pthread_join(t1,NULL);
	pthread_join(t2,NULL);
	//int pthread_mutex_destroy(*pthread_mutex_t mutex);
	pthread_mutex_destroy(&mutex);
	return 0;
}

要有两把锁,才能有死锁,当funs锁mutex时,funs2锁mutex2了,funs再想锁mutex2时就拿不到,会一直卡住,同理funs2也是。

使用多把锁时,一定要注意避免死锁

7.线程条件控制实现线程的同步

demo8.c

#include <pthread.h>
#include <stdio.h>
int data = 0;
//int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
pthread_mutex_t mutex;
pthread_cond_t cond;
//int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);
void *funs(void *arg)
{
	printf("t1:%ld\npthread is creat\n",(unsigned long)pthread_self());
	printf("parm is %d\n",*((int *)arg));
	while(1){
		//int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);
		pthread_cond_wait(&cond,&mutex);	//等待触发条件
		printf("t1:%d\n",data);
		printf("t1 qiut================\n");
		data = 0;
		sleep(1);
	}
}
void *funs2(void *arg)
{
	printf("t2:%ld\npthread is creat\n",(unsigned long)pthread_self());
	printf("parm is %d\n",*((int *)arg));
	while(1){
		printf("t2:%d\n",data);
		pthread_mutex_lock(&mutex);
		data++;	
		pthread_mutex_unlock(&mutex);
		if(data == 4){
//int pthread_cond_signal(*pthread_cond_t cond);
			pthread_cond_signal(&cond); //触发条件
		}
		sleep(1);
	}
}
//int pthread_exit(void *rval_ptr);
//int pthread_join(pthread_t thread, void **rval_ptr);
// 返回:若成功返回0,否则返回错误编号
int main()
{

	int ret;
	pthread_t t1;
	pthread_t t2;
	int *pret = NULL;
	int parm = 100;
     pthread_mutex_init(&mutex, NULL); //锁动态初始化
	//int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);
	pthread_cond_init(&cond,NULL); //条件动态初始化
	ret  = pthread_create(&t1,NULL,funs,(void *)&parm);
	if(ret == 0){
	//	printf("creat t1 is success\n");
		
	}
	ret  = pthread_create(&t2,NULL,funs2,(void *)&parm);
	if(ret == 0){
	//	printf("creat t2 is success\n");
	}
	pthread_join(t1,NULL);
	pthread_join(t2,NULL);

	//int pthread_mutex_destroy(*pthread_mutex_t mutex);
	pthread_mutex_destroy(&mutex);
//int pthread_cond_destroy(*pthread_cond_t cond);
	pthread_cond_destroy(&cond); //销毁条件
	return 0;
}

运行结果:在这里插入图片描述

此程序中会一直运行,因为data=0;一直都会在赋值。

#include <pthread.h>
#include <stdio.h>
int data = 0;
//int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
pthread_mutex_t mutex;
pthread_cond_t cond;
//int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);
void *funs(void *arg)
{
    static int cnt = 3;
	printf("t1:%ld\npthread is creat\n",(unsigned long)pthread_self());
	printf("parm is %d\n",*((int *)arg));
	while(1){
		//int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);
		pthread_cond_wait(&cond,&mutex);	//等待触发条件
		printf("t1:%d\n",data);
		printf("t1 qiut================\n");
		data = 0;
		sleep(1);
        cnt--;
        if(cnt == 0){		//当cnt=0时;整个程序退出
            exit(-1);
        }
	}
}
void *funs2(void *arg)
{
	printf("t2:%ld\npthread is creat\n",(unsigned long)pthread_self());
	printf("parm is %d\n",*((int *)arg));
	while(1){
		printf("t2:%d\n",data);
		pthread_mutex_lock(&mutex);
		data++;	
		pthread_mutex_unlock(&mutex);
		if(data == 4){
//int pthread_cond_signal(*pthread_cond_t cond);
			pthread_cond_signal(&cond); //触发条件
		}
		sleep(1);
	}
}
//int pthread_exit(void *rval_ptr);
//int pthread_join(pthread_t thread, void **rval_ptr);
// 返回:若成功返回0,否则返回错误编号
int main()
{

	int ret;
	pthread_t t1;
	pthread_t t2;
	int *pret = NULL;
	int parm = 100;
     pthread_mutex_init(&mutex, NULL); //锁动态初始化
	//int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);
	pthread_cond_init(&cond,NULL); //条件动态初始化
	ret  = pthread_create(&t1,NULL,funs,(void *)&parm);
	if(ret == 0){
	//	printf("creat t1 is success\n");
		
	}
	ret  = pthread_create(&t2,NULL,funs2,(void *)&parm);
	if(ret == 0){
	//	printf("creat t2 is success\n");
	}
	pthread_join(t1,NULL);
	pthread_join(t2,NULL);

	//int pthread_mutex_destroy(*pthread_mutex_t mutex);
	pthread_mutex_destroy(&mutex);
//int pthread_cond_destroy(*pthread_cond_t cond);
	pthread_cond_destroy(&cond); //销毁条件
	return 0;
}

用程序测试:

int main(int argc,char **argv)
//int main()
{
        int i=0;
        int time;
        time = atoi(argv[1]);
//      time = 5;
        for(i = 0; i < time ;i++){
                system("./demo8");
        }
}

在这里插入图片描述

./a.out 10 >>test.txt &运行10次,将结果放在test.txt中,& 后台运行

运行结果:在这里插入图片描述
cond 和 mutex初始化

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;//静态初始化
pthread_mutex_init(&mutex, NULL); //动态初始化
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;//静态初始化
pthread_cond_init(&cond, NULL); //动态初始化
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux系统编程——线程 的相关文章

  • 为 Qt 应用程序创建 Linux 安装

    我刚刚用 Qt Creator 制作了一个很棒的程序 我对自己很满意 如何将其从台式机移至笔记本电脑 那么 最好的方法是安装程序 对吗 对于 Ubuntu 这是一个 Debian 软件包 对吗 我怎么做 有人这样做过吗 他们可以分享 QT
  • 如何不断刷新屏幕并实时更新[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在linux上写一个C程序 不断刷新屏幕并实时更新 例如类似于top终端中的命令 谁能指出我正确的方向 为了保持它跨终端类型的可移
  • 在 Ubuntu 16.04 上找不到 printf.c

    我最近切换到Ubuntu 16 04 我在用vscode作为 Ubuntu 上的 IDE 我配置了其他语言 但我无法做到这一点C C 我创建c cpp properties json launch json tasks json 当我开始编
  • 每个进程每个线程的时间量

    我有一个关于 Windows 和 Linux 中进程和线程的时间量子的问题 我知道操作系统通常为每个线程提供固定的时间量 我知道时间量根据前台或后台线程而变化 也可能根据进程的优先级而变化 每个进程有固定的时间量吗 例如 如果操作系统为每个
  • linux x86 汇编语言 sys_read 调用的第一个参数应为 0 (stdin)

    我正在编写一个简单的汇编程序来从标准输入读取 如 scanf 这是我的代码 section bss num resb 5 section txt global start start mov eax 3 sys read mov ebx 0
  • 如何让“grep”从文件中读取模式?

    假设有一个很大的文本文件 我只想打印与某些模式不匹配的行 显然 我可以使用egrep v patter1 pattern2 pattern3 现在 如果所有这些模式都在一个文本文件中怎么办 最好的制作方法是什么egrep从文件中读取模式 g
  • C 程序从连接到系统的 USB 设备读取数据

    我正在尝试从连接到系统 USB 端口的 USB 设备 例如随身碟 获取数据 在这里 我可以打开设备文件并读取一些随机原始数据 但我想获取像 minicom teraterm 这样的数据 请让我知道我可以使用哪些方法和库来成功完成此操作以及如
  • Docker:处理 tar 文件时出错(退出状态 1):设置枢轴目录时出错:不是目录

    我是 Docker 新手 不知道是什么原因导致此错误或如何诊断它 任何有关此问题的具体帮助或有关首先检查何处以诊断此类问题的提示将不胜感激 我的 Dockerfile FROM java 8 Install maven RUN apt ge
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • diff 文件仅比较每行的前 n 个字符

    我有2个文件 我们将它们称为 md5s1 txt 和 md5s2 txt 两者都包含a的输出 find type f print0 xargs 0 md5sum sort gt md5s txt 不同目录下的命令 许多文件被重命名 但内容保
  • 如何制作和应用SVN补丁?

    我想制作一个SVN类型的补丁文件httpd conf这样我就可以轻松地将其应用到其他主机上 If I do cd root diff Naur etc httpd conf httpd conf original etc httpd con
  • 在 Linux 中禁用历史记录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 要在 Linux 环境中禁用历史记录 我执行了以下命令 export HISTFILESIZE 0 export HISTSIZE 0 u
  • 拆分字符串以仅获取前 5 个字符

    我想去那个地点 var log src ap kernelmodule 10 001 100 但看起来我的代码必须处理 ap kernelmodule 10 002 100 ap kernelmodule 10 003 101 等 我想使用
  • 使用 find - 删除除任何一个之外的所有文件/目录(在 Linux 中)

    如果我们想删除我们使用的所有文件和目录 rm rf 但是 如果我希望一次性删除除一个特定文件之外的所有文件和目录怎么办 有什么命令可以做到这一点吗 rm rf 可以轻松地一次性删除 甚至可以删除我最喜欢的文件 目录 提前致谢 find ht
  • bluetoothctl 到 hcitool 等效命令

    在 Linux 中 我曾经使用 hidd connect mmac 来连接 BT 设备 但自 Bluez5 以来 这种情况已经消失了 我可以使用 bluetoothctl 手动建立连接 但我需要从我的应用程序使用这些命令 并且使用 blue
  • 为什么我收到“无法进行二进制日志记录”的信息。在我的 MySQL 服务器上?

    当我今天启动 MySQL 服务器并尝试使用以下命令进行一些更改时用于 MySQL 的 Toad http www quest com toad for mysql 我收到此消息 MySQL 数据库错误 无法进行二进制日志记录 消息 交易级别
  • awk 子串单个字符

    这是columns txt aaa bbb 3 ccc ddd 2 eee fff 1 3 3 g 3 hhh i jjj 3 kkk ll 3 mm nn oo 3 我可以找到第二列以 b 开头的行 awk if substr 2 1 1
  • 如何检测并找出程序是否陷入死锁?

    这是一道面试题 如何检测并确定程序是否陷入死锁 是否有一些工具可用于在 Linux Unix 系统上执行此操作 我的想法 如果程序没有任何进展并且其状态为运行 则为死锁 但是 其他原因也可能导致此问题 开源工具有valgrind halgr
  • Jenkins中找不到环境变量

    我想在詹金斯中设置很多变量 我试过把它们放进去 bashrc bash profile and profile of the jenkins用户 但 Jenkins 在构建发生时找不到它们 唯一有效的方法是将所有环境变量放入Jenkinsf
  • 如何在 shell 脚本中并行运行多个实例以提高时间效率[重复]

    这个问题在这里已经有答案了 我正在使用 shell 脚本 它读取 16000 行的输入文件 运行该脚本需要8个多小时 我需要减少它 所以我将其划分为 8 个实例并读取数据 其中我使用 for 循环迭代 8 个文件 并在其中使用 while

随机推荐

  • VS2005 VS2010数据断点不能设置的原因 new data breakpoint is disabled

    数据断点是VS的一项犀利功能 尤其在我司这种代码量巨大的大型系统中 想知道一个被很多地方访问的类的变量是在什么时候被改变的是一件很困难的事情 使用数据断点能极大提高debug的效率 可昨天突然遇到了数据断点按钮变灰的情况 无法进行设置 原因
  • P4197 Peaks(主席树+Kruskal重构树+倍增)

    传送门 前缀知识 Kruskal重构树 题面 思路 看到困难值小于等于x就应该想到用Kruskal重构树了 首先我们构建一颗Kruskal重构树 然后询问是问我们从某个点 u u u出发 不超过困难值 h h h 那么这个过程我们可以用倍增
  • easyPoi实现Excel文件上传图片并改变自定义图片上传地址

    使用easypoi遇到的一个上传图片自定义图片地址的问题 解决后就保留一下 您正在使用easypoi进行excel导入图片 并希望可以更改导入后的图片地址 希望这篇文章能帮到您 本文主要是使用easypoi通过模版的形式导入图片 Maven
  • 远控免杀专题(67)-白名单(113个)总结篇

    关于白名单程序 相信大家对白名单程序利用的手法也已经非常熟悉了 白名单程序利用其实是起源于LOLBins 全称 Living Off the Land Binaries 直白翻译为 生活在陆地上的二进制 这个概念最初在2013年DerbyC
  • 2021-08-24

    记录一下在射线碰撞到得物体旁边创建一个颜色盒子UI墙 using System using System Collections using System Collections Generic using System IO using
  • Jupyter Notebook 的使用指南

    前言 Jupyter Notebook是一个开源的Web应用程序 允许用户创建和共享包含代码 方程式 可视化和文本的文档 它的用途包括 数据清理和转换 数值模拟 统计建模 数据可视化 机器学习等等 它具有以下优势 可选择语言 支持超过40种
  • 蓝桥杯——分巧克力

    标题 分巧克力 儿童节那天有K位小朋友到小明家做客 小明拿出了珍藏的巧克力招待小朋友们 小明一共有N块巧克力 其中第i块是Hi x Wi的方格组成的长方形 为了公平起见 小明需要从这 N 块巧克力中切出K块巧克力分给小朋友们 切出的巧克力需
  • 《CSAPP》(第3版)答案(第二章)(一)

    CSAPP 答案 第二章 一 P55 include
  • Qt开发 之 删除文件或文件夹到回收站(详解)

    文章目录 1 简介 1 1 问题描述 1 2 解决方案 2 源代码 2 1 WinAPI调用 2 2 两行代码解决Release版本根目录驱动问题 2 3 解决部分文件删除不成功的问题 3 QFileInfo官方说明 4 Qt 5 15版本
  • 利用HashSet求集合的交集、并集

    package com test import java util ArrayList import java util HashSet import java util Iterator import java util Set publ
  • Shell 脚本等待上一行执行完成再执行下一行的方法

    在开发中 我们有时候需要使用 Shell 脚本完成一些简单的操作 但是往往有的操作比较耗时 但是我们又不得不等待它执行完成后才能进行下面的步骤 所以许多朋友往往使用sleep等方法来强制等待操作完成 其实完全没有必要 我们只需要使用一个小小
  • sqoop:【error】ERROR tool.ImportTool: Import failed: java.io.IOException: Filesystem closed

    19 06 06 12 04 08 ERROR tool ImportTool Import failed java io IOException Filesystem closed at org apache hadoop hdfs DF
  • 机器学习——图片处理应用(人脸补全)

    0 前言 本文内容是机器学习算法回归预测的应用 其中数据集主要来自sklearn库自带的人脸数据 目的是通过KNN回归 线性回归 岭回归算法通过人物的左半张脸预测人物的右半张脸 意义1 通过该项目掌握图片数据在机器学习当中的处理方法 意义2
  • 统计学习方法学习梳理(一)统计学习的分类

    目录 1 基本分类 1 监督学习 2 无监督学习 3 强化学习 4 半监督学习 5 主动学习 2 按模型分类 1 概率模型与非概率模型 2 线性模型与非线性模型 3 参数化模型与非参数化模型 3 按算法分类 1 在线学习 2 批量学习 4
  • 为什么区块链宠物得到这么多资本家的青睐?

    区块链宠物最早进入人们视野是一款由Axiom Zen和以太坊智能合作开发的区块链宠物养成游戏 谜恋猫 也有人称其为加密猫 这款游戏基于以太坊产生 通过以太坊区块链上的智能合约进行追踪 用户需使用以太币购买猫咪 并通过智能合约自动分配 每15
  • typora的使用

    typora的使用 1 换行的实现 在一行的结尾加上两个空格实现换行 在两行之间加回车实现换行 2 标题 多少个 就多少级标题 一共六级标题 记得输完 要加空格 1 2 3 4 5 6 3 分割线 就出现分割线 要回车 4 强调 斜体 字体
  • numpy 寻找两个二维数组中重复的行(附代码)

    numpy 两个 N M 维度的 二维数组a 和 b 以行为单位 找到 a 和 b 中都存在的行 相同的行不一定出现在同一行的位置 通过遍历每一行寻找 import numpy as np 创建两个示例数组 a sorted np arra
  • 玩转触发器之Jenkins Generic Webhook使用技巧

    1 预备知识 目标 学习HTTP基础知识 掌握如何使用Postman和Curl调用接口的方法 1 1 Web HTTP基础知识 HTTP请求是什么 HTTP超文本传输协议 是确保服务器 Server 和客户端 Client 之间的正确通信
  • php同时作为server端和client端(soapclient)的超时时间设置小结

    http blog sina com cn s blog 475429950101bt7x html 场景 A通过HTTP请求B 同时B通过soap请求C webservice 然后B得到C的返回内容后 再响应回A client A gt
  • Linux系统编程——线程

    Linux系统编程 线程 1 线程概述 与进程的区别及线程的优势 2 线程创建等待退出 3 线程共享内存空间的代码验证 4 线程同步之互斥量加锁解锁 5 互斥锁限制共享资源的访问 6 什么情况造成死锁 7 线程条件控制实现线程的同步 1 线