进程是资源管理的最小单元,线程是程序执行的最小单元。在操作系统的设计上,从进程演化出线程,最主要的目的就是更好的支持SMP以及减小(进程/线程)上下文切换开销。

  就像进程有一个PID一样,每个线程也有自己的线程ID,但线程ID只在它所属的环境中有效;

    创建一个新的线程可以通过调用pthread_create()函数来创建;

    函数原型为:

    #include <pthread.h>

    int pthread_create(pthread_t *thread_addr_t, *addr, void *(*start_rtn) (void), void *restrict arg;

    第一个参数是一个指针,它指向一个pthread_t类型的结构,再创建一个线程时,这个指针指向的变量里会写入

    新线程的ID,第二个参数对线程的属性进行设置;一般默认为NULL;

    最后两个参数分别是线程将要启动执行的函数以及将要传递给这个函数的参数。

    下面的代码是创建一个新的线程:  

 #include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <pthread.h>
#include <stdlib.h> /*新线程要执行的函数*/
void *hello(void *arg)
{
printf("hello world\n");
} int main()
{
pthread_t pid = ;
int ret = ; /*获得一个新的线程*/
ret = pthread_create(&pid, NULL, hello, NULL);
if(ret < ) {
perror("pthread_create");
exit(EXIT_FAILURE);
} /* 检查线程退出状态*/
pthread_join(pid, NULL);
exit(EXIT_SUCCESS);
}

    二:互斥锁

      下面代码是主线程和工作线程共享用户的输入缓冲,主线程创建了工作线程用于统计用户输入的字符数,它们之间通过互斥锁保证对输入缓冲的访问不发生冲突;

  

 #include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <string.h>
#define WORK_SIZE 1024
pthread_mutex_t work_mutex;
char work[]; /* 工作区*/
int time_to_exit = ; /*退出标志*/ void *thread_function(void *arg); int main()
{
int ret = ;
pthread_t tid = ;
void *thread_result; /* 对互斥锁进行初始化*/
ret = pthread_mutex_init(&work_mutex, NULL);
if(ret != ) {
perror("mutex init failure");
return ;
} ret = pthread_create(&tid, NULL, thread_function, NULL);
if(ret != ) {
perror("pthread_create");
return ;
} /*给工作区加上锁,把文本读到里面
然后给它解锁允许被其他线程访问*/
pthread_mutex_lock(&work_mutex);
printf("Inpu some txt, Enter 'end' to finish\n");
while(!time_to_exit) {
fgets(work, , stdin);
pthread_mutex_unlock(&work_mutex); while() {
pthread_mutex_lock(&work_mutex);
if(work[] != '\0') {
pthread_mutex_unlock(&work_mutex);
sleep(); }
else
break;
}
}
pthread_mutex_unlock(&work_mutex);
ret = pthread_join(tid, &thread_result);
if(ret != ) {
perror("pthread_join");
return ;
} pthread_mutex_destroy(&work_mutex);
} void *thread_function(void *arg)
{
sleep();
/*新线程试图对互斥量进行加锁*/
pthread_mutex_lock(&work_mutex);
while(strncmp("end", work, ) != ) {
printf("you input %d characters\n", strlen(work) - );
/*把第一个字符设置为空字符已经完成了字符统计工作*/
work[] = '\0';
pthread_mutex_unlock(&work_mutex);
sleep(); /*周期性的尝试给互斥量加锁,如果加锁成功,
就检查主线程是否有新字符需要统计,如果没有,
解开互斥量继续等待*/
pthread_mutex_lock(&work_mutex);
while(work[] == '\0') {
pthread_mutex_unlock(&work_mutex);
sleep();
pthread_mutex_lock(&work_mutex);
}
}
/*设置退出标志*/
time_to_exit = ;
work[] = '\0';
pthread_mutex_unlock(&work_mutex);
pthread_exit();
}

linux线程及互斥锁的更多相关文章

  1. JoinableQueue队列,线程,线程于进程的关系,使用线程,线程的特点,守护线程,线程的互斥锁,死锁问题,递归锁,信号量

    1.JoinableQueue队列 JoinableQueue([maxsize]):这就像是一个Queue对象,但是队列允许项目的使用者通知生成者项目已经被成功处理.通知进程是使用共享的信号和条件变 ...

  2. Linux 线程编程2.0——线程同步-互斥锁

    当我们需要控制对共享资源的存取的时候,可以用一种简单的加锁的方法来控制.我们可以创建一个读/写程序,它们共用一个共享缓冲区,使用互斥锁来控制对缓冲区的存取. 函数 pthread_mutex_init ...

  3. 并发编程 - 线程 - 1.互斥锁/2.GIL解释器锁/3.死锁与递归锁/4.信号量/5.Event事件/6.定时器

    1.互斥锁: 原理:将并行变成串行 精髓:局部串行,只针对共享数据修改 保护不同的数据就应该用不用的锁 from threading import Thread, Lock import time n ...

  4. Linux再谈互斥锁与条件变量

    原文地址:http://blog.chinaunix.net/uid-27164517-id-3282242.html pthread_cond_wait总和一个互斥锁结合使用.在调用pthread_ ...

  5. linux 2.6 互斥锁的实现-源码分析

    http://blog.csdn.net/tq02h2a/article/details/4317211 看了看linux 2.6 kernel的源码,下面结合代码来分析一下在X86体系结构下,互斥锁 ...

  6. day34 python学习 守护进程,线程,互斥锁,信号量,生产者消费者模型,

    六 守护线程 无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁 需要强调的是:运行完毕并非终止运行 #1.对主进程来说,运行完毕指的是主进程代码运行完毕 #2.对主线程来说,运行完 ...

  7. Python中线程与互斥锁

    了解之前我们先了解一下什么是多任务? 概念: 几个不同的事件在同时运行就是多任务, 这样的话, 我们有牵扯到了真的多任务, 假的多任务; 并行: 真的多任务, 通过电脑的核数来确定 并发: 假的多任务 ...

  8. Python进阶(3)_进程与线程中的lock(线程中互斥锁、递归锁、信号量、Event对象、队列queue)

    1.同步锁 (Lock) 当全局资源(counter)被抢占的情况,问题产生的原因就是没有控制多个线程对同一资源的访问,对数据造成破坏,使得线程运行的结果不可预期.这种现象称为“线程不安全”.在开发过 ...

  9. Python 开启线程的2中方式,线程VS进程(守护线程、互斥锁)

    知识点一: 进程:资源单位 线程:才是CPU的执行单位 进程的运行: 开一个进程就意味着开一个内存空间,存数据用,产生的数据往里面丢 线程的运行: 代码的运行过程就相当于运行了一个线程 辅助理解:一座 ...

随机推荐

  1. AngularJS进阶(十七)在AngularJS应用中实现微信认证授权遇到的坑

    在AngularJS应用中集成微信认证授权遇到的坑 注:请点击此处进行充电! 前言 项目开发过程中,移动端新近增加了一个功能"微信授权登录",由于自己不是负责移动端开发的,但最后他 ...

  2. OPEN A PO ORDER OR SO ORDER

    OPEN PO ORDER fnd_function.Execute(Function_Name => 'PO_POXPOEPO', Open_Flag => 'Y', Session_F ...

  3. 基于ARM-contexA9-Linux驱动开发:如何获取板子上独有的ID号

    每个CPU,都有它固定的ID号,ID号就是这个CPU唯一的标识,它可能隐含着CPU的生产日期,版本号,型号等等,那么,在我们的这款友善之臂Tiny4412的板子上,我的这个CPU的ID又是多少呢?从我 ...

  4. nasm汇编一些需要注意的地方

    经常用msam或tasm的童鞋一下转换到nasm下可能觉得不怎么适应,它们应该先去晓习一下gas的语法,然后就适应了-that's only a joke! :) section .data v101 ...

  5. oo修仙之路

    写在前面: 之前听说过oo这门课的威力,计院全体修仙现场的图也被转了不知多少遍,然而自己不亲身经历就不知这门课的难度所在.每次debug时耳边总会想起三国杀里面周瑜的话"挣扎吧,在血和暗的深 ...

  6. 解决:MySQL 报错:1045 - Access denied for user 'root'@'localhost'(using password YES)

    一.前言 今年疯狂迷上了开源,只要看到好的开源项目,就会不顾一切一股脑扎进去研究,五一期间发现一个很好的关于众筹的开源项目,但不巧,这个项目竟然是 PHP 写的,没学过 PHP,自然对这个开源项目毫无 ...

  7. jQuery学习小结

    1.jQuery hide() 和 show() 通过 jQuery,您可以使用 hide() 和 show() 方法来隐藏和显示 HTML 元素: $("#hide").clic ...

  8. 有关Java 锁原理

    锁 锁是用来锁东西的,让别人打不开也看不到!在线程中,用这个“锁”隐喻来说明一个线程在“操作”一个目标(如一个变量)的时候,如果变量是被锁住的,那么其他线程就对这个目标既“操作”不了(挂起)也无法看到 ...

  9. android传值

    需求 OneActivity向TwoActivity传值name=hzs,然后TwoActivity向OneActivity传值sex=Y 第一步:OneActivity向TwoActivity传值n ...

  10. go 实现struct转map

    从python转golang大约一个月了,对struct的使用还算顺手,但是很多时候还是会想念python的便捷.比如同时遍历两个字典,python使用for (x, y) in zip(map1, ...