线程绑定

#include<unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include<pthread.h>
#include <sched.h>

#include<iostream>

using namespace std;

typedef struct {
  pthread_spinlock_t spinlock;
  int count;
}ThdArgs ;

void * thd_func(void *arg){
 
  while(true){
    pthread_spinlock_t *spinlock = (pthread_spinlock_t*)arg;
    pthread_spin_lock(spinlock);
    int a = 1;
    sleep(5);
    pthread_spin_unlock(spinlock);
   
    int count = 1;
    ;
  }

return (void*)0 ;

}

void * thd_func1(void *arg){
 
  while(true){
    ThdArgs *args = (ThdArgs*)arg;
    pthread_spin_lock(&args->spinlock);

if (10 == args->count){
      pthread_spin_unlock(&args->spinlock);
      return (void*)0;
    }
   
    cerr<<"Thread["<<pthread_self()<<"], count="<<args->count<<endl;
    args->count +=1 ;

sleep(5);

if ( 10== args->count){
      pthread_spin_unlock(&args->spinlock);
      return (void*)1;
   
    }
    else
      pthread_spin_unlock(&args->spinlock);
  }

return (void*)0 ;

}

int createBindThread(pthread_t *pthd, int cpuSeq, void * (*func)(void *), void *arg ){

pthread_attr_t attr1;
  pthread_attr_init(&attr1);

cpu_set_t cpuset;
  CPU_ZERO(&cpuset);
  CPU_SET(cpuSeq, &cpuset);

if( pthread_attr_setaffinity_np(&attr1, sizeof(cpuset), &cpuset) ){
    cerr<<"setaffinity error "<<endl;
    return -1;

}

if ( pthread_create(pthd, &attr1, func, arg) ){
    cerr<<"pthread_create error "<<endl;
    return -1;
  }

return 0;
}

int main(){

int cpuCount = (int)sysconf(_SC_NPROCESSORS_ONLN);
  cout<<"cpu count="<<cpuCount<<endl;

sched_param schedParam;
  schedParam.sched_priority = 1;

if (sched_setscheduler(getpid(), SCHED_FIFO, &schedParam) == -1){
    cerr<<"sched_setscheduler error:"<<strerror(errno)<<endl;
  }

pthread_t thd1, thd2;

/*

pthread_spinlock_t spinlock;
  pthread_spin_init(&spinlock, PTHREAD_PROCESS_PRIVATE);

createBindThread(&thd1, 0, thd_func, (void*)&spinlock);
  createBindThread(&thd2, 1, thd_func, (void*)&spinlock);
  */

ThdArgs args;
  args.count = 0;
  pthread_spin_init(&args.spinlock, PTHREAD_PROCESS_PRIVATE);
   
  createBindThread(&thd1, 0, thd_func1, (void*)&args);
  createBindThread(&thd2, 1, thd_func1, (void*)&args);

/*
  while(true){
    int a = 1;
  }

*/

void *rslt1 = NULL;
  void *rslt2 = NULL;

pthread_join(thd1, &rslt1);
  pthread_join(thd2, &rslt2);

cout<<"test over, thread["<<thd1<<"]  return"<<rslt1<<", thread["<<thd2<<"] return"<<rslt2<<endl;

return 0;

}

时间: 2024-10-12 12:15:24

线程绑定的相关文章

[原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Spring基于ThreadLocal的“资源-事务”线程绑定设计的缘起

题目起的有些拗口了,简单说,这篇文章想要解释Spring为什么会选择使用ThreadLocal将资源和事务绑定到线程上,这背后有着什么样的起因和设计动机,通过分析帮助大家更清晰地认识Spring的线程绑定机制.本文原文链接:http://blog.csdn.net/bluishglc/article/details/7784502 转载请注明出处! “原始”的数据访问写法 访问任何带有事务特性的资源系统,像数据库,都有着相同的特点:首先你需要获得一个访问资源的“管道”,对于数据库来说,这个所谓的

Hibernate中Session与本地线程绑定

------------------siwuxie095 Hibernate 中 Session 与本地线程绑定 1.Session 类似于 JDBC 的连接 Connection 2.Session 对象是单线程对象,只能自己使用,不能共用 将 Session 与本地线程绑定,保证 Session 对象绝对是一个单线程对象 3.Hibernate 帮助我们实现了 Session 与本地线程绑定(底层是 ThreadLocal) 4.获取与本地线程绑定的 Session (1)在 Hiberna

Linux进程或线程绑定到CPU

Linux进程或线程绑定到CPU 为了让程序拥有更好的性能,有时候需要将进程或线程绑定到特定的CPU,这样可以减少调度的开销和保护关键进程或线程. 进程绑定到CPU Linux提供一个接口,可以将进程绑定到特定的CPU: #include <sched.h> int sched_setaffinity(pid_t pid, size_t cpusetsize, const cpu_set_t *mask); int sched_getaffinity(pid_t pid, size_t cpu

JAVA学习篇--ThreadLocal,Java中特殊的线程绑定机制

在DRP项目中,我们使用了ThreadLocal来创建Connection连接,避免了一直以参数的形式将Connection向下传递(传递connection的目的是由于jdbc事务要求确保使用同一个connection连接).那么ThreadLocal是如果做到的呢?它和同步锁的不同在哪里? 是什么: 对于ThreadLocal看英文单词我们很容易理解为一个线程的本地实现,但是它并不是一个Thread,而是threadlocalvariable(线程局部变量).也许把它命名为ThreadLoc

linux下将不同线程绑定到不同core和cpu上——pthread_setaffinity_np

=============================================================== linux下的单进程多线程的程序,要实现每个线程平均分配到多核cpu,主要有2个方法 1:利用linux系统自己的线程切换机制,linux有一个服务叫做irqbalance,这个服务是linux系统自带的,默认会启动,这个服务的作用就是把多线程平均分配到CPU的每个核上面,只要这个服务不停止,多线程分配就可以自己实现.但是要注意,如果线程函数内部的有某个循环,且该循环内

Java-ThreadLocal,Java中特殊的线程绑定机制

在DRP项目中,我们使用了ThreadLocal来创建Connection连接,避免了一直以参数的形式将Connection向下传递(传递connection的目的是由于jdbc事务要求确保使用同一个connection连接).那么ThreadLocal是如果做到的呢?它和同步锁的不同在哪里? 是什么: 对于ThreadLocal看英文单词我们很容易理解为一个线程的本地实现,但是它并不是一个Thread,而是threadlocalvariable(线程局部变量).也许把它命名为ThreadLoc

Linux编程之《进程/线程绑定CPU》

Intro----- 通常我们在编写服务器代码时,可以通过将当前进程绑定到固定的CPU核心或者线程绑定到固定的CPU核心来提高系统调度程序的效率来提高程序执行的效率,下面将完整代码贴上.```/************************************************ * 该例程讲解了进程.线程绑定到固定的cpu核心上运行 * 来提高程序运行效率************************************************/#include <unistd

ThreadLocal(线程绑定)

为保证在DAO层里的操作都在同一事务里,我们曾使用以参数的形式将Connection向下传递的方式,而ThreadLocal来创建Connection连接,避免了一直以参数的形式将Connection向下传递(传递connection的目的是由于jdbc事务要求确保使用同一个connection连接).那么ThreadLocal是如果做到的呢?它和同步锁的不同在哪里? 是什么: 对于ThreadLocal看英文单词我们很容易理解为一个线程的本地实现,但是它并不是一个Thread,而是thread

linux 将进程或者线程绑定到指定的cpu上

基本概念 cpu亲和性(affinity) CPU的亲和性, 就是进程要在指定的 CPU 上尽量长时间地运行而不被迁移到其他处理器,也称为CPU关联性:再简单的点的描述就将指定的进程或线程绑定到相应的cpu上:在多核运行的机器上,每个CPU本身自己会有缓存,缓存着进程使用的信息,而进程可能会被OS调度到其他CPU上,如此,CPU cache命中率就低了,当绑定CPU后,程序就会一直在指定的cpu跑,不会由操作系统调度到其他CPU上,性能有一定的提高. 软亲和性(affinity) 就是进程要在指