作者:采蘑菇的小熙熙_395 | 来源:互联网 | 2023-09-14 13:01
- 线程和进程的区别是不同享栈空间,其他的数据都是同享的
- 所以在子线程中要转数据到主线程中就要用全局变量
- 线程的信息所以栈保存的
一,线程的创建和主线程和子线程的通信
1,创建子线程的操作
参数一:子线程id
参数二:事件
参数三:回调函数
参数四:回调函数的参数
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *, void *arg);
2,退出子线程的的函数
参数: 传数据到主线程中指针 必须是全局变量
这是因为线程是不同享栈空间的
void pthread_exit(void *retval);
3,阻塞函数的使用
参数一:子线程id
参数二:子线程传递的数据
int pthread_join(pthread_t thread, void **retval);
4,终止线程的操作
int pthread_cancel(pthread_t thread);void pthread_testcancel(void);
5,子线程分离的操作函数
int pthread_detach(pthread_t thread);
线程创建转换数据
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include typedef struct
{int age;char name[64];
}Student;
Student p;
void *pthread_call(void *args)
{Student *ptr = (Student *)args;printf("age :%d, name:%s\n", ptr->age, ptr->name);p.age = 21;strcpy(p.name, "杨艳");pthread_exit((void*)&p);
}int main(int argc, char *argv[])
{pthread_t tpid;int ret;Student stu;stu.age = 23;strcpy(stu.name, "陈丽");ret = pthread_create(&tpid, NULL, pthread_call, (void *)&stu );if (ret != 0){printf("create phtread error:%s\n", strerror(ret));return -1;}Student *pstr;void *ptr;pthread_join(tpid, &ptr);pstr = (Student *)ptr;printf("age:%d, name:%s\n", pstr->age, pstr->name);return 0;
}
子线程的分离的操作
#include
#include
#include
#include
#include
#include
#include
#include
#include #define PETACH 1
#define NUPETACH 0void *pthread_call(void *args)
{printf("陈丽\n");pthread_exit(NULL);
}int main(int argc, char *argv[])
{pthread_t tpid;int ret;
#if NUPETACHret = pthread_create(&tpid, NULL, pthread_call, NULL);ret = pthread_detach(tpid);
#endif#if PETACH pthread_attr_t atr;pthread_attr_init(&atr);pthread_attr_setdetachstate(&atr, PTHREAD_CREATE_DETACHED);ret = pthread_create(&tpid, NULL, pthread_call, NULL);
#endifif (ret != 0){printf("create pthread :%s\n", strerror(ret));return -1;}if (ret != 0){printf("create detach :%s\n", strerror(ret));return -1;}ret = pthread_join(tpid, NULL);if (ret != 0){printf("create join :%s\n", strerror(ret));return -1;}
#if PETACHpthread_attr_destroy(&atr);
#endif return 0;
}
二,线程同步的操作
- pthread_mutex_init()
- pthread_mutex_lock()
- pthread_mutex_unlock()
- pthread_mutex_destroy()
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include #define LOCK 1
#define UNLOCK 0#if LOCKpthread_mutex_t mutex;
#endif#define COUNT 1000int number = 0;void *pid_A(void *args)
{int i, n = 0;for (i = 0; i #if LOCK pthread_mutex_lock(&mutex);
#endifn = number;n++;usleep(100);number = n;printf("A:%d\n", number);
#if LOCK pthread_mutex_unlock(&mutex);
#endif}pthread_exit(NULL);
}
void *pid_B(void *args)
{int i, n = 0;for (i = 0; i #if LOCK pthread_mutex_lock(&mutex);
#endifn = number;n++;number = n;printf("B:%d\n", number);
#if LOCK pthread_mutex_unlock(&mutex);
#endif}pthread_exit(NULL);
}int main(int argc, char *argv[])
{pthread_t tpid1, tpid2;
#if LOCKpthread_mutex_init(&mutex, NULL);
#endifint ret;ret = pthread_create(&tpid1, NULL, pid_A, NULL);if (ret != 0){printf("create thread :%s\n", strerror(ret));return -1;}ret = pthread_create(&tpid2, NULL, pid_B, NULL);if (ret != 0){printf("create thread :%s\n", strerror(ret));return -1;}pthread_join(tpid1, NULL);pthread_join(tpid2, NULL);#if LOCKpthread_mutex_destroy(&mutex);
#endifreturn 0;
}
LOCK = 0 的图
LOCK = 1 效果图