Linux之线程:同步与互斥
2016-09-26 18:05
267 查看
首先我们来说一下同步是什么:
其实所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回,同时其它线程也不能调用这个方法。按照这个定义,其实绝大多数函数都是同步调用(例如sin, isdigit等)。但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。例如Window API函数SendMessage。该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。当对方处理完毕以后,该函数才把消息处理函数所返回的LRESULT值返回给调用者。
也就是针对于同一个需要解决的问题,但是我们需要多个执行流进行同时操作,所以我们就需要对这个任务进行分工计算,最终得到一个最终结果,相当于树的根部求值。唯一不同的就是线程/进程之间进行访问操作,总有访问到相同的数据性,如果当前的计算机的访问问题存在不一致的原子性,就会出现我们资源上的抢占回访错误或者出现死锁问题,这个我们后面提。
说简单了就是:同步就是多个线程按照约定顺序共同完成一个任务。也就是线程控制与创建。
然后我们看一段代码:
[code=cpp;toolbar:false">#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define NLOOP 5000
static int g_count = 0;
void* read_write_mem(void *_val)
{
int val = 0;
int i = 0;
for (;i<NLOOP;++i)
{
val = g_count ;
printf("pthread id is :%x,count is :%d\n",(unsigned long )pthread_self(),g_count);
g_count = val +1;
}
return NULL;
}
int main()
{
pthread_t tid1;
pthread_t tid2;
pthread_create(&tid1,NULL,read_write_mem,NULL);
pthread_create(&tid2,NULL,read_write_mem,NULL);
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
printf("count final val is :%d\n",g_count);
return 0;
}#include <pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mutex);//阻塞式
int pthread_mutex_trylock(pthread_mutex_t *mutex);//非阻塞式
int pthread_mutex_unlock(pthread_mutex_t *mutex);
其实所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回,同时其它线程也不能调用这个方法。按照这个定义,其实绝大多数函数都是同步调用(例如sin, isdigit等)。但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。例如Window API函数SendMessage。该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。当对方处理完毕以后,该函数才把消息处理函数所返回的LRESULT值返回给调用者。
也就是针对于同一个需要解决的问题,但是我们需要多个执行流进行同时操作,所以我们就需要对这个任务进行分工计算,最终得到一个最终结果,相当于树的根部求值。唯一不同的就是线程/进程之间进行访问操作,总有访问到相同的数据性,如果当前的计算机的访问问题存在不一致的原子性,就会出现我们资源上的抢占回访错误或者出现死锁问题,这个我们后面提。
说简单了就是:同步就是多个线程按照约定顺序共同完成一个任务。也就是线程控制与创建。
然后我们看一段代码:
[code=cpp;toolbar:false">#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define NLOOP 5000
static int g_count = 0;
void* read_write_mem(void *_val)
{
int val = 0;
int i = 0;
for (;i<NLOOP;++i)
{
val = g_count ;
printf("pthread id is :%x,count is :%d\n",(unsigned long )pthread_self(),g_count);
g_count = val +1;
}
return NULL;
}
int main()
{
pthread_t tid1;
pthread_t tid2;
pthread_create(&tid1,NULL,read_write_mem,NULL);
pthread_create(&tid2,NULL,read_write_mem,NULL);
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
printf("count final val is :%d\n",g_count);
return 0;
}#include <pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mutex);//阻塞式
int pthread_mutex_trylock(pthread_mutex_t *mutex);//非阻塞式
int pthread_mutex_unlock(pthread_mutex_t *mutex);
相关文章推荐
- Linux 进程与线程的同步与互斥
- 关于linux中多进程(线程)同步和互斥
- Linux环境下线程的同步与互斥以及死锁问题
- Linux — 浅析线程以及多线程的同步与互斥
- Linux线程浅析[线程的同步和互斥之线程读写锁]
- 介绍Linux下面线程的操作、多线程的同步和互斥
- linux下线程的同步和互斥
- linux中线程的同步与互斥
- Linux--线程的同步与互斥
- Linux利用信号量实现线程的同步与互斥
- 本文一个例子展开,介绍Linux下面线程的操作、多线程的同步和互斥
- Linux互斥与同步应用(一):posix线程及线程间互斥
- Linux 编程之【线程】同步与互斥
- linux中线程的同步和互斥
- 讲Linux下面线程的操作、多线程的同步和互斥相关函数及操作的文章链接
- 讲Linux下面线程的操作、多线程的同步和互斥相关函数及操作的文章链接
- 同步事件,信号量,互斥,临界区,线程,线程池C++实现(win32,linux)
- linux 系统编程-学习笔记9--线程的同步互斥锁、读写锁/select/poll
- Linux线程浅析[线程的同步和互斥之线程死锁,线程与信号的关系]
- Linux线程浅析[线程的同步和互斥之线程互斥锁]