1.一个demo

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>#define LEFT 30000000
#define RIGHT 30000200
#define SIZE (RIGHT-LEFT+1)void * Fun(void *p)
{int nNum = * (int *)p;int Flag = 1;int j;for(j = 2; j < nNum/2; j++){if(0 == nNum % j){Flag = 0;}}if(Flag){printf("%d is a prime\n", nNum);}pthread_exit(NULL);
}int main()
{pthread_t tid[SIZE];int i,err;for(i = LEFT ; i <= RIGHT; i++){err = pthread_create(tid+(i-LEFT), NULL, Fun, &i);if(err){fprintf(stderr, "create()%s ", strerror(err));exit(1);}}for(i = LEFT; i <= RIGHT; i++){pthread_join(tid[i-LEFT], NULL);}return 0;
}

我先创建了201个线程,然后每一个线程计算一个数字,最后在join
可是结果一直不对

最离谱的结果是输出了十几个3000000是一个质数,原因是因为产生了竞争

err = pthread_create(tid+(i-LEFT), NULL, Fun, &i);int nNum = * (int *)p;

一直在创建线程,可是当前面的线程没有执行赋值语句,i的值就被改变了

2.改进

①最丑陋的一个做法

 err = pthread_create(tid+(i-LEFT), NULL, Fun, (void *)i);int nNum = (int )p;

直接不传递地址了,强转

②给201个不同地址的空间,这也不会冲突
③还需改进 后续学习。。。。。

3.

每个线程的栈是独立的,你每个栈的大小越小,则该进程可以创建的线程越多,ulimit默认一个线程的大小是10M,32位地址空间,一个进程的虚拟大小是4G,内核态占据1G

4.一个demo

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>#define THRNUM 20
#define FILENAME "log"
#define LINESIZE 1024void * Fun(void *p)
{FILE *fp  = fopen(FILENAME,"r+");char Buf[LINESIZE];if(NULL == fp){perror("fopen()");exit(1);}fgets( Buf, LINESIZE, fp);fseek(fp, 0, SEEK_SET);fprintf(fp, "%d\n", atoi(Buf)+1);//fflush(NULL);fclose(fp);pthread_exit(NULL);
}int main()
{pthread_t tid[THRNUM];int i,err;for(i = 0 ; i <= THRNUM; i++){err = pthread_create(tid+i, NULL, Fun, NULL);if(err){fprintf(stderr, "create()%s ", strerror(err));exit(1);}}for(i = 0; i <= THRNUM; i++){pthread_join(tid[i], NULL);}return 0;
}

创建20个线程,读取同一个文件,取出来数字,然后加1写回,log起初是1
我们执行完之后,应该是21

5.解决方式 互斥量

如果我们对文件 只进行打开和读取的话,那没有问题,但是我们进行了写入,所以我们必须得把写操作这一段代码加上锁,每次只允许一个线程对这个文件进行写,别的就在那里阻塞
限制了某段代码的运行,而非某个变量

NAME
pthread_mutex_lock,  pthread_mutex_trylock, pthread_mutex_unlock- lock and unlock a mutexSYNOPSIS
#include <pthread.h>int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
NAMEpthread_mutex_destroy, pthread_mutex_init - destroy and initialize a mutexSYNOPSIS#include <pthread.h>int pthread_mutex_destroy(pthread_mutex_t *mutex);int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

#define THRNUM 20
#define FILENAME "log"
#define LINESIZE 1024pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; void * Fun(void *p)
{FILE *fp  = fopen(FILENAME,"r+");char Buf[LINESIZE];if(NULL == fp){perror("fopen()");exit(1);}pthread_mutex_lock(&mut);fgets( Buf, LINESIZE, fp);fseek(fp, 0, SEEK_SET);fprintf(fp, "%d\n", atoi(Buf)+1);fclose(fp);pthread_mutex_unlock(&mut);pthread_exit(NULL);
}int main()
{pthread_t tid[THRNUM];int i,err;for(i = 0 ; i <= THRNUM; i++){err = pthread_create(tid+i, NULL, Fun, NULL);if(err){fprintf(stderr, "create()%s ", strerror(err));exit(1);}}for(i = 0; i <= THRNUM; i++){pthread_join(tid[i], NULL);}pthread_mutex_destroy(&mut);return 0;
}

初探线程之线程竞争及故障相关推荐

  1. linux 线程--内核线程、用户线程实现方法

    Linux上进程分3种,内核线程(或者叫核心进程).用户进程.用户线程 内核线程拥有 进程描述符.PID.进程正文段.核心堆栈 当和用户进程拥有相同的static_prio 时,内核线程有机会得到更多 ...

  2. 简述java的线程_JAVA线程简述

    一.先谈谈并行与并发: 并行:是指两个或多个事件在同一时刻发生. 并发:是指连个或多个事件在同一时间间隔内发生. 二.接下来我们进入正题,讨论一下线程和进程: 1)什么是线程和进程? 进程:是一个具有 ...

  3. C#中的线程(二) 线程同步基础

    1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具:                       简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程 ...

  4. 【Android 异步操作】线程池 ( 线程池简介 | 线程池初始化方法 | 线程池种类 | AsyncTask 使用线程池示例 )

    文章目录 一.线程池简介 二.线程池初始化方法简介 三.线程池使用示例 一.线程池简介 线程池一般是实现了 ExecutorService 接口的类 , 一般使用 ThreadPoolExecutor ...

  5. 【Android 异步操作】线程池 ( 线程池作用 | 线程池种类 | 线程池工作机制 | 线程池任务调度源码解析 )

    文章目录 一.线程池作用 二.线程池种类 三.线程池工作机制 四.线程池任务调度源码解析 一.线程池作用 线程池作用 : ① 避免创建线程 : 避免每次使用线程时 , 都需要 创建线程对象 ; ② 统 ...

  6. Java线程:线程的同步与锁

    一.同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 例如:两个线程ThreadA.ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据. public  ...

  7. c++ 线程池_基础篇:高并发一瞥,线程和线程池的总结

    进程是执行程序的实体,拥有独属的进程空间(内存.磁盘等).而线程是进程的一个执行流程,一个进程可包含多个线程,共享该进程的所有资源:代码段,数据段(全局变量和静态变量),堆存储:但每个线程拥有自己的执 ...

  8. 【Java线程】线程协作

    通过一个经典的例子-生产者与消费者模型来理解一下线程的协作: 当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权.因为生产者如果不 ...

  9. 信号灯文件锁linux线程,linux——线程同步(互斥量、条件变量、信号灯、文件锁)...

    一.说明 linux的线程同步涉及: 1.互斥量 2.条件变量 3.信号灯 4.文件读写锁 信号灯很多时候被称为信号量,但个人仍觉得叫做信号灯比较好,因为可以与"SYSTEM V IPC的信 ...

  10. 开线程插数据_python笔记7-多线程之线程同步(锁lock)

    前言丨 关于吃火锅的场景,小伙伴并不陌生,前面几章笔记里面我都有提到,今天我们吃火锅的场景: 吃火锅的时候a同学往锅里下鱼丸,b同学同时去吃掉鱼丸,有可能会导致吃到生的鱼丸. 为了避免这种情况,在下鱼 ...

最新文章

  1. 2022年:机器人技术的重大革命
  2. sqlserver数据库类型对应Java中的数据类型
  3. 什么是API,SDK?它们之间有什么关系?
  4. 【python3】爬取鼠绘汉化的海贼王漫画
  5. linux指令popd,Linux切换目录pushd、popd、dirs命令
  6. nginx缓存和flask_cache
  7. 【学习笔记】吴恩达机器学习 WEEK2 线性回归 Octave教程
  8. Client Side Cache 和 Server Side Cache 的区别
  9. 高精度计时器 -- C++/Windows版
  10. 将WinServers2019打造成家用系统
  11. python单例模式数据库连接池_《java设计模式》一文带你了解单例模式
  12. Mysql最常用的十大函数
  13. dbeaver一款全能的数据库连接工具dbeaver
  14. Java菜鸟教程 一些简单的练习
  15. 传统运维 VS 互联网运维 框架体系大观
  16. 如何成为优秀的网络工程师,怎么做到含金量高?
  17. Java 生成视频缩略图(ffmpeg)
  18. 使用Electron将html网页转为exe可执行文件(全屏, 遮住任务栏, Esc退出, exe的图标/文件名修改)
  19. 改(微微微微微小说)
  20. qq空间的相册名称java_qq相册名称大全简单

热门文章

  1. 系统如何实现权限控制
  2. Django中ORM常用字段及字段参数
  3. iOS Unicode转中文(UTF-8)
  4. shell历史命令记录功能
  5. mysql百万数据生成
  6. C#正则表达式通过HTML提取网页中的图片src
  7. Mac OSX用终端检测文件的sha1值
  8. ios获取设备的唯一标识mac address
  9. 网页小工具(学习中国象棋)
  10. 2010.11.13网规论文关注点