一、创建线程
1、编译链接库
gcc –lpthead
2、定义变量
pthread_t th;
3、创建
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
pthread_create(&th, NULL, fun, arg);
4、子线程
void *fun (void * arg)
{
return(void)*0;
}
5、主线程等待
main要等待子线程结束,所以需要join函数,不然就return了:
int pthread_join(pthread_t tid,void **rval);
pthread_join(th, NULL);
二、互斥锁
6、race condition
线程1和线程2都是在用同一把锁,只是说谁先抢到了谁先上锁,然后解锁了,另一个线程才能上锁。
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const
pthread_mutexattr_t *restrict attr);
初始化锁:
pthread_mutex_t lock;
pthread_mutex_init(&lock, NULL);
在func()里:对fun()上锁解锁
void* func(void* argc)
{
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
}
三、假共享
多核,内存地址相连比较近的时候会出现假共享:
进程1是操作results[0]的
进程2是操作results[1]的
但是内核为了方便,把results[0]和results[1]都写入缓存,这样子数据一旦变化,都得变化,造成了运行时间变长。
把数组变大,把线程1的结果和线程2的结果存的原点,就不会出现假共享了