class="markdown_views prism-atelier-sulphurpool-light">
【linux系统下多线程编程学习笔记代码】
- 线程:“轻量级”的进程。
- 与创建它的进程共享代码段,数据段
- 拥有自己独立的栈。
注意:使用线程,编译和链接程序必须加上选项【-pthread】,使用方法见博客下面Makefile
【代码&说明】
/****************************************************************************************
* 文件名: pro.c
* 创建者:
* 时 间:
* 联 系:
* 简 介: 多线程编程控制,参考API文档《Unix环境高级编程》
*****************************************************************************************/
/***********************************************************
函数学习:
1、创建线程: int pthread_create(pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine) (void *),
void *arg);
返回值: 成功0 失败返回错误编码
参数一:线程id
参数二:存储线程的属性的结构
参数三:指明线程的入口函数
参数四:入口函数的参数,可为NULL
2、等待线程结束: int pthread_join(pthread_t thread, void **retval);
参数一:要等待结束的线程id
参数二:保存线程退出的状态,一般为NULL
返回值:成功0,否则返回错误代码
3、线程退出: void pthread_exit(void *retval); 结束调用此函数的线程
参数一:保存返回值
-------------------------------------------------------------------
线程互斥:
【互斥锁】:
1、初始化:int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);
参数一:根据参数二的 属性初始化互斥锁
参数二:互斥锁的属性,如果为NULL,使用默认属性
返回值:成功0,否则返回错误代码
2、获取: int pthread_mutex_lock(pthread_mutex_t *mutex);
参数一: 指明要锁住的互斥锁
返回值: 成功0,否则返回错误代码
3、释放锁: int pthread_mutex_unlock(pthread_mutex_t *mutex);
参数一: 指明要解开的互斥锁
返回值: 成功0,否则返回错误代码
4、注销互斥锁: int pthread_mutex_destroy(pthread_mutex_t *mutex);
参数一:要删除的互斥锁
返回值: 成功0,否则返回错误代码
-----------------------------------------------------------------------
【综合实例】:
一位老师让学生去扫雪,老师充当主进程,学生充当线程2,班长充当线程1,两个人需要扫20此才能够扫完一条小路。
但是目前扫把只有一个,只有在其中一个人休息的时候另一个能才能扫雪,所以扫把是共享资源。
************************************************************/
#include "mytype.h"
#define PTHREAD_COUNT 2
static unsigned int clean_snow_cnt = 0;
pthread_mutex_t mulock;
void delay()
{
int i,k;
for(i=0; i<10000; i++)
for(k=0; k<10000; k++)
;
}
void *stu1_opertion()
{
int cnt;
int res;
DEBUG_INFO("I am stu1 .
");
for(cnt=0; cnt<10; cnt++)
{
pthread_mutex_lock(&mulock);
++clean_snow_cnt;
pthread_mutex_unlock(&mulock);
DEBUG_INFO("[stu1]-> clean snow count = %d
", clean_snow_cnt);
sleep(1);
}
DEBUG_INFO("student 1 clean snow end .
");
pthread_exit(&res);
if(res != 0)
{
DEBUG_ERROR("pthread_exit-> stu1 failed .
");
}
return 0;
}
void *stu2_opertion()
{
int cnt;
int res;
DEBUG_INFO("I am stu2 .
");
for(cnt=0; cnt<10; cnt++)
{
pthread_mutex_lock(&mulock);
++clean_snow_cnt;
pthread_mutex_unlock(&mulock);
DEBUG_INFO("[stu2]-> clean snow count = %d
", clean_snow_cnt);
sleep(1);
}
DEBUG_INFO("student 2 clean snow end .
");
pthread_exit(&res);
if(res != 0)
{
DEBUG_ERROR("pthread_exit-> stu2 failed .
");
}
return 0;
}
int main()
{
int res;
int count;
pthread_t stu_thread[PTHREAD_COUNT];
res = pthread_mutex_init(&mulock,NULL);
if(res != 0)
{
DEBUG_ERROR("mutex lock init failed .
");
exit(EXIT_FAILURE);
}
if( (res=pthread_create(&stu_thread[0], NULL, stu1_opertion, NULL)) ==0 )
{
DEBUG_INFO("creat stu1 successful .
");
}
if( (res=pthread_create(&stu_thread[1], NULL, stu2_opertion, NULL)) == 0)
{
DEBUG_INFO("creat stu2 successful .
");
}
for(count=0; countif(res != 0)
{
DEBUG_WARNING("pthread_join-> stu %d failed , error code : %d
", count+1, res);
}
}
res = pthread_mutex_destroy(&mulock);
if(res != 0)
{
DEBUG_ERROR("pthread_mutex_destroy failed, error code : %d", res);
}
return 0;
}
#ifndef _MYTYPE_H_
#define _MYTYPE_H_
#define USE_TIME 0
#define USE_SIGNAL 0
#define USE_SHARE_MEMORY 0
#define USE_SEMAPHORE 0
#define USE_MSG_QUEUE 0
#define USE_FILE_CTL 0
#define USE_THREAD 1
#include
#include
#include
#if USE_SIGNAL
#include
#endif // USE_SIGNAL
#if USE_SEMAPHORE
#include
#include
#endif // USE_SEMAPHORE
#if USE_SHARE_MEMORY
#include
#endif // USE_SHARE_MEMORY
#if USE_MSG_QUEUE
#if !USE_SEMAPHORE
#include
#endif
#include
#endif // USE_MSG_QUEUE
#include
#include
#include
#if USE_FILE_CTL
#include
#endif // USE_FILE_CTL
#if USE_TIME
#include
#endif // USE_TIME
#if USE_THREAD
#include
#endif // USE_THREAD
#ifndef bool
typedef unsigned int bool;
#endif
enum
{
true = 1,
false = !true
};
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned short ushort;
#define DEBUG_INFO(...) printf("Info: "); printf(__VA_ARGS__)
#define DEBUG_ERROR(...) printf("Error: "); printf(__VA_ARGS__)
#define DEBUG_WARNING(...) printf("Warning: "); printf(__VA_ARGS__)
#define DEBUG_PRINTF(...) printf(__VA_ARGS__)
#if USE_SEMAPHORE
typedef struct sem_use SEM_USE;
struct sem_use
{
int semid;
key_t key;
struct sembuf sops;
};
#endif // USE_SEMAPHORE
#if USE_SHARE_MEMORY
typedef struct shmem_use SHMEM_USE;
struct shmem_use
{
int shmid;
key_t key;
};
#define BUF_SIZE 1024*1 //共享内存大小
typedef struct shmem_area SHMEM_AREA;
struct shmem_area
{
bool isnull;
char data[BUF_SIZE];
};
#endif // USE_SHARE_MEMORY
#if USE_MSG_QUEUE
typedef struct msg_queue_use MSG_QUEUE_USE;
struct msg_queue_use{
key_t key;
int msgid;
};
#endif // USE_MSG_QUEUE
#endif // _TYPE_H_
【结果】
【Makefile】
【运行结果】
end