初识Linux线程

Linux的线程也是曲折的,2.4内核的时候居然线程使用进程来实现。不过2.6内核我是没看到有什么诡异的了。线程是线程,进程是进程。
为什么要线程呢?
线程的切换,不需要切换进程的上下文,比如N多寄存器值的保存。所以是轻量级的。速度也更快,但是同时也带来很多问题,比如同步。
现在让我们来简单看看Linux的线程吧。
下面的程序,通过多线程,并且互斥来对一个变量累加。


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

#define MAX 100
pthread_mutex_t mutex; //互斥量
static int count; //需要同步的数据

void err_quit(char *msg)
{
fprintf(stderr,"%s\n",msg);
exit(0);
}
void *th_incre(void *arg) //一个线程执行的函数
{
int pid;
pthread_mutex_lock(&mutex); //加锁互斥量
pid = (int)arg;
printf("%d thread and count=%d\n",pid,count);
count++;
pthread_mutex_unlock(&mutex); //别忘了解锁
pthread_exit((void *)0); //线程退出,也可以return,注意返回值
}

int main(int argc, char *argv[])
{
pthread_t pid[MAX];
int i,err;
void *status[MAX];

long max_thread=sysconf(_SC_THREAD_THREADS_MAX);//这句废话,Linux不支持
printf("MAX_THREAD=%ld\n",max_thread);
pthread_mutex_init(&mutex, NULL);//请不要忘记初始化互斥量,当然也可以用静态的PTHREAD_MUTEX_INITIALIZER
for(i = 0; i < MAX; i++){
err = pthread_create(&pid[i],NULL,th_incre,(void *)i); //这一句是关键。
if(err != 0)
err_quit("create thread error");
pthread_join(pid[i],&status[i]);//等待线程退出,很可能出错。在redhat5.5上出错
}
pthread_mutex_destroy(&mutex);//有初始化,就有销毁
exit(0);
}




一个简单多线程程序。并使用了互斥量同步。当然,线程还有很多复杂的东西。以后再说。
对了,这里要说一下,在连接的时候请使用 -lpthread 选项,要加载线程库。
$gcc -g -Wall -lpthread -o count th_count.o 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值