linux应用编程之线程编程

1 线程创建

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

void thread(void)
{
	int i;
	for(i=0;i<3;i++)
	{
		printf("this is a pthread\n");
	}
}

int main(void)
{
	pthread_t id;
	int i,ret;

	ret = pthread_create(&id,NULL,(void *)thread,NULL);
	if(ret != 0){
		printf("create pthread error\n");
		exit(1);
	}

	for(i=0;i<3;i++)
		printf("this is main process\n");

	pthread_join(id,NULL);
	printf("thread over here\n");
	return 0;

}

2 线程绑定

上面1的代码,使用pthread_create创建一个线程,在这个线程中,使用默认参数,即函数的第二个参数 pthread_attr_t *attr设为NULL。

属性值包括是否绑定、是否分离、堆栈地址、堆栈大小、优先级。默认的属性是非绑定、非分离、缺省1M的堆栈、与父进程同样级别的优先级。

关于线程的绑定,涉及另一个概念:轻线程。轻线程可以理解为内核线程,它位于用户层和系统层之间。系统对线程资源的分配、对线程的控制是通过轻线程来实现的,一个轻线程可以控制一个或多个线程。默认情况下,启动多少轻线程、哪些轻线程来控制哪些线程是由系统来控制,这种情况即称为非绑定的。绑定状态下,顾名思义,则某个线程固定的绑在一个轻线程之上。被绑定的线程具有较高的响应速度,这是因为cpu时间片的调度室面向轻进程的。绑定的进程可以保证在需要的时候它总有一个轻进程可用。通过设置被绑定的轻进程的优先级和调度级可以使得绑定的线程满足诸如实时反应之类的要求。

设置线程绑定状态的函数为pthread_attr_setscope,第一个参数是指向属性结构的指针,第二个参数是绑定类型:PTHREAD_SCOPE_SYSTEM(绑定类型) PTHREAD_SCOPE_PROCESS(非绑定)

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

void my_func(void);

int main()
{
	pthread_attr_t attr;
	pthread_t tid;

	pthread_attr_init(&attr);

	/*PTHREAD_SCOPE_SYSTEM  means bonding thread ,PTHREAD_SCOPE_PROCESS :unbonding pthread ,can be unsed for action needed right time*/
	pthread_attr_setscope(&attr,PTHREAD_SCOPE_SYSTEM);

	pthread_create(&tid,&attr,(void *)my_func,NULL);

	pthread_join(tid,NULL);//here is blocked

	printf("thread over\n");

	return 0;
}

void my_func(void)
{
	sleep(4);
	printf("thread process\n");
	//while(1);
}

3 线程的堵塞

使用pthread_create()的默认参数的话,在主线程(创建线程的线程)中,通过调用pthread_join()等待线程,这里会一直阻塞,直到线程退出为止。例子中,由于线程一直 在while循环中,所以主函数会没法退出

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

void *my_func(void *arg);

int main()
{
	pthread_t tid1,tid2;

	pthread_create(&tid1,NULL,(void *)my_func,"thread 1");

	pthread_create(&tid2,NULL,(void *)my_func,"thread 2");

	pthread_join(tid1,NULL);//here is blocked
	pthread_join(tid2,NULL);

	printf("thread over\n");

	return 0;
}

void *my_func(void *arg)
{
	printf("thread process\n");
	while(arg)
	{
		sleep(2);
		printf("%s\n",(char *)arg);
	}
}

4 阻塞函数与解阻塞信号的使用

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

pthread_mutex_t mymutex1 = PTHREAD_MUTEX_INITIALIZER;
//pthread_mutex_t mymutex2 = PTHREAD_MUTEX_INITIALIZER;

pthread_cond_t mycond = PTHREAD_COND_INITIALIZER;

void *mythread1(void *param)
{
	printf("begin mythread1.\n");
	pthread_mutex_lock(&mymutex1);

	printf("wait in my thread1.\n");
	pthread_cond_wait(&mycond,&mymutex1);
	pthread_mutex_unlock(&mymutex1);
	printf("end mythread1.\n");
	return NULL;
}

void *mythread2(void *param)
{
	printf("begin mythread2.\n");
	pthread_mutex_lock(&mymutex1);

	printf("wait in my thread2.\n");
	pthread_cond_wait(&mycond,&mymutex1);
	pthread_mutex_unlock(&mymutex1);
	printf("end mythread2.\n");
	return NULL;
}

int main(void)
{
	printf("begin main thread\n");
	int i;
	pthread_t tid1,tid2;
	pthread_create(&tid1,NULL,mythread1,NULL);
	pthread_create(&tid2,NULL,mythread2,NULL);
	sleep(5);
	printf("try to wake up mythread1 and mythread2 in main thread.\n");
	#if 1
	if(pthread_cond_broadcast(&mycond)){
		printf("unlock error\n");
		return 1;
	}
	#endif
	void *res;
	pthread_join(tid1,&res);
	pthread_join(tid2,&res);
	printf("end main thread.\n");
	return 0;
}

部分参考:

http://blog.csdn.net/hudashi/article/details/7709421

时间: 2024-10-14 08:21:52

linux应用编程之线程编程的相关文章

Linux线程编程之信号处理

前言 Linux多线程环境中的信号处理不同于进程的信号处理.一方面线程间信号处理函数的共享性使得信号处理更为复杂,另一方面普通异步信号又可转换为同步方式来简化处理. 本文首先介绍信号处理在进程中和线程间的不同,然后描述相应的线程库函数,在此基础上给出一组示例代码,以讨论线程编程中信号处理的细节和注意事项.文中涉及的代码运行环境如下: 本文通过sigwait()调用来“等待”信号,而通过signal()/sigaction()注册的信号处理函数来“捕获”信号,以体现其同步和异步的区别. 一  概念

Linux程序设计学习笔记----多线程编程线程同步机制之互斥量(锁)与读写锁

互斥锁通信机制 基本原理 互斥锁以排他方式防止共享数据被并发访问,互斥锁是一个二元变量,状态为开(0)和关(1),将某个共享资源与某个互斥锁逻辑上绑定之后,对该资源的访问操作如下: (1)在访问该资源之前需要首先申请互斥锁,如果锁处于开状态,则申请得到锁并立即上锁(关),防止其他进程访问资源,如果锁处于关,则默认阻塞等待. (2)只有锁定该互斥锁的进程才能释放该互斥锁. 互斥量类型声明为pthread_mutex_t数据类型,在<bits/pthreadtypes.h>中有具体的定义. 互斥量

跟我一起做面试题-linux线程编程(5)

如题所述: 生产者消费者问题 这是一个非常经典的多线程题目,题目大意如下:有一个生产者在生产产品,这些产品将提供给若 干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲 区中取走产品进行消费,所有生产者和消费者都是异步方式运行的,但它们必须保持同步,即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经 装满产品且尚未被取走的缓冲区中投放产品. 1 #include <stdio.h> 2

linux 线程编程详解

1.线程的概念: 线程和进程有一定的相似性,通常称为轻量级的进程 同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等.但同一进程中的多个线程都有自身控制流 (它自己的指令计数器和cpu时钟)和各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage). 一个进程可以有很多线程,每条线程并行执行不同的任务. 线程可以提高应用程序在多核环境下处理诸如文件I/O或者s

Linux程序设计学习笔记----多线程编程之线程同步之条件变量

转载请注明出处:http://blog.csdn.net/suool/article/details/38582521. 基本概念与原理 互斥锁能够解决资源的互斥访问,但是在某些情况下,互斥并不能解决问题,比如两个线程需 要互斥的处理各自的操作,但是一个线程的操作仅仅存在一种条件成立的情况下执行,一旦错过不可再重现,由于线程间相互争夺cpu资源,因此在条件成立的时候,该线程不一定争夺到cpu而错过,导致永远得不到执行..... 因此需要某个机制来解决此问题,更重要的是,线程仅仅只有一种情况需要执

转 学习linux下的c/c++编程

http://blog.csdn.net/byxdaz/article/details/3959680 1,先有linux环境搭minGW和cygwin都有点麻烦,最最简单的办法还是装个真正的linux,用虚拟机也好,在网络上的另一台机器也好.这样不仅快,而且你有了真正的环境.2.会C/C++语言(估计你会的)3.入门阶段熟悉gcc命令行,最基本的参数,如,-g,-W,-O,-o,-c 建议看man gcc(很大找想要的)4.编译第一个helloworld程序: 基本命令 gcc hellowo

linux 操作系统下c语言编程入门

2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门--时间概念 5)Linux程序设计入门--信号处理 6)Linux程序设计入门--消息管理 7)Linux程序设计入门--线程操作 8)Linux程序设计入门--网络编程 9)Linux下C开发工具介绍 1)Linux程序设计入门--基础知识 Linux下C语言编程基础知识 前言: 这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将 会学到以下内容: 源程序编

POSIX 线程编程(二)线程建立与终止

创建与终止线程 线程的管理常用的API有:pthread_create(thread,attr,start_routine,arg) pthread_exit(status) pthread_cancel(thread) pthread_attr_init(attr) pthread_attr_destroy(attr) 创建线程: 一个main程序包含一个默认的主线程,这个主线程在程序开始运行的时候由系统创建.除此之外的所有其他线程必须由程序员显式的创建. pthread_create 创建一

Posix线程编程指南(1)

Posix线程编程指南(1) 作者:杨沙洲 原文地址:http://www.ibm.com/developerworks/cn/linux/thread/posix_threadapi/part1/ 线程创建与取消 这是一个关于Posix线程编程的专栏.作者在阐明概念的基础上,将向您详细讲述Posix线程库API.本文是第一篇将向您讲述线程的创建与取消. 1 线程创建 1.1 线程与进程 相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有