栈是属于线程的,有几个线程,就会有几个栈;堆和代码段属于进程。
各个线程中的errno是独立的。
进程ID用pid_t来表示,它是一个unsigned int。
线程ID用pthread_t表示,但其不是整数。
捕捉信号最好只在主函数中捕捉。
例子如下:
void *func1(void *arg)
{
int *p = (int *)arg;
int i = *p;
free(p);
printf("pthread%dstart\n", i);
static int a = 0;
for(a = 0; a < i; a++)
{
printf("pthread%dhehe a = %d\n", i, a);
sleep(1);
}
printf("pthread%dend\n", i);
return NULL;
}
void createthr()
{
pthread_t thrd1, thrd2;
int *i1 = malloc(sizeof(int));
int *i2 = malloc(sizeof(int));
*i1 = 4;
*i2 = 9;
if (pthread_create(&thrd1, NULL, func1, i1) != 0)
{
printf("error is%s\n", strerror(errno));
}
if (pthread_create(&thrd2, NULL, func1, i2) != 0)
{
printf("error is %s\n", strerror(errno));
}
pthread_join(thrd1, NULL);//主线程挂起,等待thrd1退出
pthread_join(thrd2, NULL);//主线程挂起,等待thrd2退出
return;
}
int main(void)
{
createthr();
printf("mainend");
return EXIT_SUCCESS;
}
为了让主线程省去去子线程收尸的过程,可以使用
int pthread_detach(pthread_t thread);
一旦线程成为可分离线程之后,就不能再使用pthread_join了
可分离线程的使用场景
1、主线程不需要等待子线程
2、主线程不关心子线程的返回码
例子如下:
void *func1(void *arg)
{
printf("pthreadstart\n");
while(1)
{
printf("pthreadliving\n");
sleep(1);
}
printf("pthreadend\n");
int *p = malloc(sizeof(int));
*p = 2;
return p;
}
void *func2(void *arg)
{
sleep(5);
pthread_t thr;
thr = *(pthread_t *)arg;
pthread_cancel(thr);
int *p = malloc(sizeof(int));
*p = 2;
return p;
}
int main(void)
{
pthread_t thrd1, thrd2;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);//设置线程参数为可分离
if (pthread_create(&thrd1, &attr, func1, NULL) !=0)
{
printf("error is%s\n", strerror(errno));
}
if (pthread_create(&thrd2, NULL, func2, &thrd1) != 0)
{
printf("error is%s\n", strerror(errno));
}
pthread_attr_destory(&attr);
pthread_join(thrd1, NULL);//可分离后,pthread_join调用失败
printf("mainend");
return EXIT_SUCCESS;
}
//互斥锁的例子
pthread_mutex_t mutex =PTHREAD_MUTEX_INITIALIZER;//初始化了一个MUTEX锁
void *func1(void *arg)
{
pthread_mutex_lock(&mutex);//给mutex加锁,这是一条原子操作,不可能出现两个线程同时执行这个代码
int*a = (int *) arg;
printf("thread%dstart\n", *a);
inti;
for(i = 0; i < 10; i++)
{
printf("thread%dis running\n", *a);
sleep(1);
}
printf("thread%dend\n", *a);
pthread_mutex_unlock(&mutex);//给mutex解锁
pthread_exit(NULL);
}
int main(int arg, char * args[])
{
printf("processstart\n");
pthread_tthr_d1, thr_d2;
inti[2];
i[0]= 1;
i[1]= 2;
pthread_create(&thr_d1,NULL, func1, &i[0]);
pthread_create(&thr_d2,NULL, func1, &i[1]);
pthread_join(thr_d1,NULL);
pthread_join(thr_d2,NULL);
printf("processend\n");
return0;
}
//最恰当的互斥用法
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
pthread_mutex_t mutex =PTHREAD_MUTEX_INITIALIZER;//初始化了一个MUTEX锁
int count = 0;
void *func1(void *arg)
{
int*a = (int *) arg;
printf("thread%dstart\n", *a);
inti;
for(i = 0; i < 10; i++)
{
printf("thread%dis running\n", *a);
sleep(1);
pthread_mutex_lock(&mutex);//给mutex加锁,这是一条原子操作,不可能出现两个线程同时执行这个代码
count++;//这段代码受到保护,永远只有一个线程可以操作
pthread_mutex_unlock(&mutex);//给mutex解锁
}
printf("thread%dend\n", *a);
pthread_exit(NULL);
}
int main(int arg, char * args[])
{
printf("processstart\n");
pthread_tthr_d1, thr_d2;
inti[2];
i[0]= 1;
i[1]= 2;
pthread_create(&thr_d1,NULL, func1, &i[0]);
pthread_create(&thr_d2,NULL, func1, &i[1]);
pthread_join(thr_d1,NULL);
pthread_join(thr_d2,NULL);
printf("processend\n");
return0;
}