linux C 多线程/线程池编程 同步实例

在多线程、线程池编程中经常会遇到同步的问题。

1.创建线程

  函数原型:int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);

  参数:thread指向线程id的指针;attr指向线程属性的指针;第三个为执行的方法的函数指针;arg指向给方法传递的参数的指针。

2.互斥变量

  (1)互斥变量   pthread_mutex_t

  (2)互斥变量锁定  int pthread_mutex_lock(pthread_mutex_t *mutex);

  (3)互斥变量解锁  int pthread_mutex_unlock(pthread_mutex_t *mutex);

3.多线程/线程池实例

下面是一个Linux C多线程同步取任务的操作,设定任务总量用MAX_JOB表示,当前任务编号用current_job表示。

文件名:a.c

 #include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#define MAX_JOB 50 ///任务总量 typedef struct {
pthread_t thread_tid;
} Thread; Thread *tptr;
int current_job=; ///当前任务编号
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; ///互斥锁 void* thread_run(void* arg)
{
int jobid;
for(;;)
{
pthread_mutex_lock(&lock);
if(current_job>MAX_JOB) ///任务已经完成
jobid=-;
else
{
jobid=current_job;
current_job++;
}
pthread_mutex_unlock(&lock); if(jobid==-)
{
printf("thread %d over\n",(int)arg);
break;
}
else
printf("thread %d get the job %d\n",(int)arg,jobid);
}
return ;
} int main () {
int i;
int threadNum; ///线程个数
scanf("%d",&threadNum);
tptr=(Thread*)malloc(sizeof(Thread)*threadNum); for(i=;i<threadNum;i++) ///创建threadNum个线程
pthread_create(&tptr[i].thread_tid, NULL, &thread_run, (void *) i); for(i=;i<threadNum;i++)
{
if(current_job>MAX_JOB)
{
printf("ALL OVER!!!\n");
break;
}
else
{
printf("OK\n");
sleep(); ///停留1秒
} }
sleep(); ///停留4秒,等待最后一批任务的完成
return ;
}

编译:gcc -lpthread a.c -o a

执行输出:./a

linux C 多线程/线程池编程  同步实例

上一篇:jsp中的el表达式没有解析


下一篇:一个js搜索功能的实现