首页 > 其他分享 >并发锁与线程池(二)

并发锁与线程池(二)

时间:2024-03-30 10:31:50浏览次数:20  
标签:count COUNT int ++ 并发 线程 pthread include

前置内容:并发锁与线程池(一)

1.互斥锁的实现

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

#define THREAD_COUNT	10
pthread_mutex_t mutex;  

void *thread_callback(void *arg) {

	int *pcount = (int *)arg;
	int i = 0;

	while (i ++ < 100000) {
        pthread_mutex_lock(&mutex);
		(*pcount) ++; 
		pthread_mutex_unlock(&mutex); //互斥锁
		usleep(1);
	}

}
``int main () {
	pthread_t threadid[THREAD_COUNT] = {0};

	pthread_mutex_init(&mutex, NULL); //初始化互斥锁
	int i = 0;
	int count = 0;
	for (i = 0;i < THREAD_COUNT;i ++) {
		pthread_create(&threadid[i], NULL, thread_callback, &count);
	}                //创建线程

	for (i = 0;i < 100;i ++) {
		printf("count : %d\n", count);
		sleep(1);
	}

}

2.自旋锁的实现:

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

#define THREAD_COUNT	10

pthread_spinlock_t spinlock;

void *thread_callback(void *arg) {

	int *pcount = (int *)arg;
	int i = 0;

	while (i ++ < 100000) {
	pthread_spin_lock(&spinlock);
		(*pcount) ++; //
		pthread_spin_unlock(&spinlock);
		usleep(1);
	}

}
int main () {

	pthread_t threadid[THREAD_COUNT] = {0};
	pthread_spin_init(&spinlock, PTHREAD_PROCESS_SHARED);  //初始化自旋锁

	int i = 0;
	int count = 0;
	for (i = 0;i < THREAD_COUNT;i ++) {
		pthread_create(&threadid[i], NULL, thread_callback, &count);
	}                //创建线程

	for (i = 0;i < 100;i ++) {
		printf("count : %d\n", count);
		sleep(1);
	}

}

3.原子操作的实现:

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

#define THREAD_COUNT	10
int inc(int *value, int add) {

	int old;

	__asm__ volatile(
		"lock; xaddl %2, %1;"
		: "=a" (old)
		: "m" (*value), "a"(add)
		: "cc", "memory"
	);

	return old;
}   //原子操作
void *thread_callback(void *arg) {

	int *pcount = (int *)arg;
	int i = 0;

	while (i ++ < 100000) {
	inc(pcount, 1);

#endif
		usleep(1);
	}

}
int main () {

	pthread_t threadid[THREAD_COUNT] = {0};

	int i = 0;
	int count = 0;
	for (i = 0;i < THREAD_COUNT;i ++) {
		pthread_create(&threadid[i], NULL, thread_callback, &count);
	}                //创建线程

	for (i = 0;i < 100;i ++) {
		printf("count : %d\n", count);
		sleep(1);
	}

}

标签:count,COUNT,int,++,并发,线程,pthread,include
From: https://blog.csdn.net/m0_74973115/article/details/137154015

相关文章

  • Java面试必问题22:如何创建线程池(偏重点)&&创建线程池的注意事项
    企业最佳实践:不要使用Executors直接创建线程池,会出现OOM问题,要使用ThreadPoolExecutor构造方法创建,引用自《阿里巴巴开发手册》【强制】线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽......
  • Java面试必问题21:线程池核心参数
    publicThreadPoolExecutor(intcorePoolSize,                        intmaximumPoolSize,                        longkeepAliveTime,                        TimeUnitunit,        ......
  • 消息队列,缓存,分库分表是高并发解决方案
    消息队列的七种经典应用场景 在笔者心中,消息队列,缓存,分库分表是高并发解决方案三剑客。在职业生涯中,笔者曾经使用过ActiveMQ、RabbitMQ、Kafka、RocketMQ这些知名的消息队列。这篇文章,笔者结合自己的真实经历,和大家分享消息队列的七种经典应用场景。1异步&解耦笔......
  • C#多线程编程详细教学
     在C#中,多线程编程是一种非常重要的技术,它允许程序同时执行多个任务,从而提高了应用程序的响应性和整体性能。本文将详细介绍C#中的多线程编程,包括基本概念、线程创建、线程同步以及相关的代码示例。一、基本概念线程是操作系统进行运算调度的最小单位,它被包含在进程之中,是......
  • 原来这就是线程安全(一)
    @TOC一:什么是线程不安全??先看一段代码:publicclassDemo1{publicstaticintcount=0;publicstaticvoidmain(String[]args)throwsInterruptedException{Threadt1=newThread(()->{for(inti=0;i<50000;i++){......
  • cnc数据采集 ,机床数据采集,设备联网,多品牌多线程采集驱动,融合马扎克、西门子、海德汉、
    +cnccaiji采集驱动可以对不同品牌的机床信息进行管理(ip、端口、采集点位、车间、工厂、设备名称、编号)等,将采集到的数据通过mqtt或者http推送到指定地址,实现和业务系统的完全解耦。对于不了解cnc采集相关业务的公司来讲非常的友好。驱动支持系统 马扎克马扎克MAZAKCNC数据采......
  • 支付宝面试太太太刁钻了!!如果把线程池 corePoolSize 设置为 0,会出现什么情况?
    大家好,我是R哥。最近做Java面试辅导,有个学员面试支付宝,遇到一个特别有意思的问题:如果把线程池corePoolSize设置为0,会出现什么情况?这个问题一说出来,我都感觉有点***钻。。这几年我创作小程序:Java面试库,积累了2700+的Java面试题,什么***钻的面试题没见过?像这样的**......
  • 使用三个线程交替打印ABC
    //用的是线程、互斥锁、条件变量#include<iostream>#include<thread>#include<mutex>#include<condition_variable>usingnamespacestd;mutex_mutex; //定义锁变量condition_variablecv; //定义条件变量intflag=0; //切换线程的标识符,flag:0-2分别对应A......
  • 虚拟线程知识分享
    1相关概念-操作系统线程(operatingsystemthreads):即硬件设备配备的线程,一般和服务器硬件的核心数量,例如interCPU的大核拥有两个操作系统线程,小核拥有一个操作系统线程。云服务器的线程数一般和服务器配置上的核心数量相同。-平台线程(PaltformThread):java.lang.Th......
  • 高并发场景防止库存数量超卖少卖
    简介商品超卖现象,即销售数量超过了实际库存量,通常是由于未能正确判断库存状况而发生的。在常规的库存管理系统中,我们会在扣减库存之前进行库存充足性检验:仅当库存数量大于零时,系统才会执行扣减动作;若库存不足,则即时返回错误提示。然而,在高并发的销售场景下,传统的处理方法往往......