线程(thread)

在一个进程中的多个执行线路就是线程。准确的说线程是进程内部的一条执行路径

从分配资源的角度--------》进程的属性

从调度、执行的角度--------》线程的属性

某一时刻两个线程都在执行---------》(并行)

某一时间段内两个线程都在执行-----------》(并发)交替执行

一般而言,线程之间的切换需要操作系统做的工作要比进程之间的切换少得多,因此多个线程对资源的需求要远小于多个进程。

pthread_creat:创建线程

pthread_exit:退出线程

pthread_join:等价于进程中用来收集子进程信息的wait函数

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<pthread.h>
void* thread_fun(void *arg)
{
    int i=0;
    for(;i<10;i++)
    {
	printf("fun run\n");
	sleep(1);
    }
    pthread_exit("fun over");
}


int main()
{
    pthread_t id;
    pthread_create(&id,NULL,thread_fun,NULL);//创建线程,已经被创建出来的线程和主线程并发
	//传递了一个 pthread_t类型对象的地址,可以用它来引用这个新的线程,我们不想改变默认的线程属性,所以设置第二个参数为NULL
	//thread_fun是线程将要调用新的函数,NULL是一个传给该函数的参数
	//调用成功后将会有两个线程执行。原先的线程main继续执行pthread_create后的代码,而新线程开始执行thread_fun()函数
    int i=0;
    for(;i<5;i++)
    {
	printf("main run\n");
	sleep(1);
    }
    char *s= NULL;
   // pthread_join(id,(void **)&s);//主线程先于子线程结束,这时子线程正常执行

    exit(0);//主线程结束程序退出,子线程也结束
}

如下图:主线程先于子线程退出,子线程正常运行 

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<pthread.h>
void* thread_fun(void *arg)//用同一个线程函数
{
    int index = *((int* )arg);
    int i=0;
    for(;i<5;i++)
    {
	printf("index=%d\n",index);
	sleep(1);
    }
}


int main()
{
    pthread_t id[5];
    int i=0;
    for(;i<5;i++)
    {
	pthread_create(&id[i],NULL,thread_fun,(void*)&i);//创建线程,已经被创建出来的线程和主线程并发,主线程的执行速度比子线程快得多
	//此时主线程的i是几 拿到的就是几
	//sleep(1);//每隔一秒创建一个进程
    }
    for(i=0;i<5;i++)
    {

	pthread_join(id[i],NULL);
    
    }

    exit(0);

}

 

 

 

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<pthread.h>
int g=0;
void* thread_fun(void *arg)//用同一个线程函数
{

    int i=0;
    for(;i<1000;i++)
    {
	printf("g=%d\n",++g);

    }
}


int main()
{
    pthread_t id[5];
    int i=0;
    for(;i<5;i++)
    {
	pthread_create(&id[i],NULL,thread_fun,NULL);//创建线程,已经被创建出来的线程和主线程并发
	//sleep(1);
    }
    for(i=0;i<5;i++)
    {

	pthread_join(id[i],NULL);
    
    }

    exit(0);

}

 

 

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

#include<semaphore.h>
int g=0;
sem_t sem;//使用信号量对线程进行控制
void* thread_fun(void *arg)//用同一个线程函数
{

    int i=0;
    for(;i<1000;i++)
    {
	sem_wait(&sem);
	printf("g=%d\n",++g);
	sem_post(&sem);

    }
}


int main()
{
    sem_init(&sem,0,1);//
    pthread_t id[5];
    int i=0;
    for(;i<5;i++)
    {
	pthread_create(&id[i],NULL,thread_fun,NULL);//创建线程,已经被创建出来的线程和主线程并发
	//sleep(1);
    }
    for(i=0;i<5;i++)
    {

	pthread_join(id[i],NULL);
    
    }
    sem_destroy(&sem);//

    exit(0);

}

 

 

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<pthread.h>
void* thread_fun(void *arg)//用同一个线程函数
{
    char str[]={"a b c d e f g h k l"};
    char *s=strtok(str," ");
    while(s !=NULL)
    {
	printf("s=%s\n",s);
	sleep(1);
	s=strtok(NULL," ");
    }
}


int main()
{
    pthread_t id;
    
	pthread_create(&id,NULL,thread_fun,NULL);//创建线程,已经被创建出来的线程和主线程并发
	char arr[]={"1 2 3 4 5 6 7 8 9"};
	char *p=strtok(arr," ");
	while(p!=NULL)
	{
	    printf("p=%s\n",p);
	    sleep(1);
	    p=strtok(NULL," ");
	}
    

    

	pthread_join(id,NULL);
    
    

    exit(0);

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值