- 浏览: 1482691 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (691)
- linux (207)
- shell (33)
- java (42)
- 其他 (22)
- javascript (33)
- cloud (16)
- python (33)
- c (48)
- sql (12)
- 工具 (6)
- 缓存 (16)
- ubuntu (7)
- perl (3)
- lua (2)
- 超级有用 (2)
- 服务器 (2)
- mac (22)
- nginx (34)
- php (2)
- 内核 (2)
- gdb (13)
- ICTCLAS (2)
- mac android (0)
- unix (1)
- android (1)
- vim (1)
- epoll (1)
- ios (21)
- mysql (3)
- systemtap (1)
- 算法 (2)
- 汇编 (2)
- arm (3)
- 我的数据结构 (8)
- websocket (12)
- hadoop (5)
- thrift (2)
- hbase (1)
- graphviz (1)
- redis (1)
- raspberry (2)
- qemu (31)
- opencv (4)
- socket (1)
- opengl (1)
- ibeacons (1)
- emacs (6)
- openstack (24)
- docker (1)
- webrtc (11)
- angularjs (2)
- neutron (23)
- jslinux (18)
- 网络 (13)
- tap (9)
- tensorflow (8)
- nlu (4)
- asm.js (5)
- sip (3)
- xl2tp (5)
- conda (1)
- emscripten (6)
- ffmpeg (10)
- srt (1)
- wasm (5)
- bert (3)
- kaldi (4)
- 知识图谱 (1)
最新评论
-
wahahachuang8:
我喜欢代码简洁易读,服务稳定的推送服务,前段时间研究了一下go ...
websocket的helloworld -
q114687576:
http://www.blue-zero.com/WebSoc ...
websocket的helloworld -
zhaoyanzimm:
感谢您的分享,给我提供了很大的帮助,在使用过程中发现了一个问题 ...
nginx的helloworld模块的helloworld -
haoningabc:
leebyte 写道太NB了,期待早日用上Killinux!么 ...
qemu+emacs+gdb调试内核 -
leebyte:
太NB了,期待早日用上Killinux!
qemu+emacs+gdb调试内核
参考http://haoningabc.iteye.com/blog/1709157
在c中多线程,打印数据互相不影响的例子
关键点在pthread_mutex_lock
无锁的情况
testptread.c
编译:
输出结果
a和b的打印每次输出都是不同的乱序的
-------------------------------
带锁的thread
testptread_lock.c
无论a,b是什么时候开始,一定是一个结束之后,锁释放后, 第二个才开始
------------------------------
如果上面的访问用进程实现
则用如下
在c中多线程,打印数据互相不影响的例子
关键点在pthread_mutex_lock
无锁的情况
testptread.c
#include <stddef.h> #include <stdio.h> #include <unistd.h> #include "pthread.h" void * process(void * arg) { int i; fprintf(stderr, "Starting process %s\n", (char *) arg); for (i = 0; i < 100; i++) { write(1, (char *) arg, 1); // fprintf(stdout, (char *) arg, 1); } return NULL; } int hello(){ printf("hello"); return 1; } int main() { int retcode; pthread_t th_a, th_b; void * retval; retcode = pthread_create(&th_a, NULL, process, "a"); if (retcode != 0) fprintf(stderr, "create a failed %d\n", retcode); retcode = pthread_create(&th_b, NULL, process, "b"); if (retcode != 0) fprintf(stderr, "create b failed %d\n", retcode); retcode = pthread_join(th_a, &retval); if (retcode != 0) fprintf(stderr, "join a failed %d\n", retcode); retcode = pthread_join(th_b, &retval); if (retcode != 0) fprintf(stderr, "join b failed %d\n", retcode); return 0; }
编译:
#!/bin/sh gcc testptread.c -lpthread
输出结果
a和b的打印每次输出都是不同的乱序的
-------------------------------
带锁的thread
testptread_lock.c
#include <stddef.h> #include <stdio.h> #include <unistd.h> #include "pthread.h" pthread_mutex_t mymutex=PTHREAD_MUTEX_INITIALIZER; void * process(void * arg) { int i; fprintf(stderr, "Starting process %s\n", (char *) arg); pthread_mutex_lock(&mymutex); for (i = 0; i < 100; i++) { write(1, (char *) arg, 1); // fprintf(stdout, (char *) arg, 1); } pthread_mutex_unlock(&mymutex); return NULL; } int hello(){ printf("hello"); return 1; } int main() { int retcode; pthread_t th_a, th_b; void * retval; retcode = pthread_create(&th_a, NULL, process, "a"); if (retcode != 0) fprintf(stderr, "create a failed %d\n", retcode); retcode = pthread_create(&th_b, NULL, process, "b"); if (retcode != 0) fprintf(stderr, "create b failed %d\n", retcode); retcode = pthread_join(th_a, &retval); if (retcode != 0) fprintf(stderr, "join a failed %d\n", retcode); retcode = pthread_join(th_b, &retval); if (retcode != 0) fprintf(stderr, "join b failed %d\n", retcode); return 0; }
无论a,b是什么时候开始,一定是一个结束之后,锁释放后, 第二个才开始
------------------------------
如果上面的访问用进程实现
则用如下
#include <stdio.h> char buf[]={"check lock!\n"}; int main(int argc,char *argv[]){ int i,p1,p2,fd; fd=creat("lock.dat",0644); write(fd,buf,20); while((p1=fork())==-1); if(p1==0){ lockf(fd,1,0); for(i=1;i<=3;i++){ printf("child1!\n"); } lockf(fd,0,0); }else{ while((p2=fork())==-1); if(p2==0){ lockf(fd,1,0); for(i=1;i<=4;i++){ printf("child2!\n"); } lockf(fd,0,0); }else{ printf("parrent!\n"); } } close(fd); }
发表评论
-
weak_ptr解决循环引用问题
2021-03-08 21:12 1194C++11引入的三种智能指 ... -
gcc链接顺序
2019-10-12 18:25 658代码在 https://github.com/killinux ... -
c++11的function和bind
2019-09-10 16:12 538参考:https://www.cnblogs.co ... -
opengl的helloworld
2014-10-22 19:41 9091.我提供一个不需要配置环境就可运行的源码。 glut.h放在 ... -
画图板用c++实现和用js实现的websocket版本
2014-10-17 13:02 2135画图板 opencv的c++ #include <o ... -
c语言内存
2014-07-02 10:26 6991、C中内存分为五个区 栈:用来存放函数的形参和函数内的局部变 ... -
重定向stdout到文件
2014-03-05 18:37 5494把stdout重定向到文件 两种方法: 第一种方法没有恢复 ... -
通过nginx远程执行shell
2014-03-03 10:26 5099saltstack远程执行shell,远程管理等返回json已 ... -
c的urldecode
2014-02-28 18:22 1368#include <stdio.h> #in ... -
c调用c++
2013-10-12 15:24 1183参考 http://www.cppblog.com/frank ... -
用C语言,实现接收管道输出的结果,并显示
2013-04-23 21:35 1950在shell里利用“|”管道干的事情就是io重定向,把“|”命 ... -
关于char * 与 char[]
2013-04-22 21:56 967问题引入: 在实习过程中发现了一个以前一直默认的错误,同样ch ... -
单向链表翻转
2012-12-25 23:41 1026临时笔记,创建一个链表 #include <stdl ... -
trie 树 的代码
2012-12-14 23:20 1145想起搜狐老大的一句话 看代码先看h文件,擦,当初感觉他这句话很 ... -
指针函数与函数指针的区别
2012-12-14 22:44 1205一、 1、指针函数是指带指针的函数,即本质是一个函数。函数返回 ... -
指针和数组
2012-11-14 22:40 1076转载http://kan.weibo.com/con/3512 ... -
js备份
2012-10-31 23:56 1730<!DOCTYPE HTML PUBLIC " ... -
线程的helloworld
2012-10-30 21:51 1610#include<stdio.h> #inc ... -
c的书籍
2012-10-30 10:56 1133http://www.acm.uiuc.edu/webmonk ... -
深入理解计算机系统第三章笔记 gcc
2012-10-24 12:11 1534随便写个最简单程序 然后gcc -S 看汇编 在gcc -C ...
相关推荐
pthread_mutex_lock(&mtx); data_ready = 1; pthread_cond_signal(&cond); // 通知消费者数据已准备好 pthread_mutex_unlock(&mtx); } // 消费者线程 void* consumer(void* arg) { while (1) { pthread_mutex...
本文将深入探讨`pthread_mutex`在Linux环境下的使用,以及它在多线程同步中的作用。 首先,让我们理解什么是互斥。在多线程环境中,互斥是指同一时间只有一个线程能访问特定的资源或代码段,以防止数据竞争和其他...
在分析提供的源代码时,我们可以看到如何使用`pthread_mutex_lock()`和`pthread_mutex_unlock()`来控制对缓冲区的访问,并可能使用`pthread_cond_wait()`和`pthread_cond_signal()`或`pthread_cond_broadcast()`来...
pthread_mutex_lock(&mutex); while (!condition) { pthread_cond_wait(&cond, &mutex); } // 代码执行需要在条件满足时进行的部分 pthread_mutex_unlock(&mutex); ``` 4. **线程同步问题**:如果在`pthread...
1. **获取互斥锁**:在调用`pthread_cond_wait`之前,线程必须先通过`pthread_mutex_lock`获取到互斥锁,确保对共享资源的独占访问。 2. **检查条件**:线程会检查当前运行的条件是否满足。如果条件不满足,线程会...
例如,`pthread_create()`用于创建新的线程,`pthread_join()`用于等待线程结束,`pthread_mutex_t`和`pthread_mutex_lock()`、`pthread_mutex_unlock()`用于互斥锁,保证资源的安全访问,`pthread_cond_t`和`...
1. 互斥锁:通过`pthread_mutex_init()`、`pthread_mutex_lock()`和`pthread_mutex_unlock()`来初始化、锁定和解锁互斥锁,确保同一时间只有一个线程能访问临界区。 2. 条件变量:允许线程在满足特定条件时挂起,当...
pthread-win32是pthread库的一个移植版本,它为Windows操作系统提供了与Posix线程兼容的API,使得C和C++开发者能够在Windows上使用pthread相关的函数,如`pthread_create`、`pthread_join`、`pthread_mutex_lock`等...
- 互斥锁(mutex):pthread_mutex_init()和pthread_mutex_lock()、pthread_mutex_unlock()用于保护共享资源,防止数据竞争。 - 条件变量(condition variable):pthread_cond_init()、pthread_cond_wait()和...
linux 内核 mutex.c 源码分析实例,我的实例主要先初始化了一个互斥体m,然后获取互斥体的锁(解锁),紧接着释放互斥体的锁(解锁)。最后释放互斥体。中间通过输出m.count来显示互斥体的状态。
ret = pthread_mutex_lock(&mutex); if (ret != 0) { // 错误处理 } // 临界区,只有获得锁的线程能执行到这里 ``` 4. 完成临界区的操作后,使用`pthread_mutex_unlock()`释放锁,以便其他线程可以获取。 ```c //...
libpthread.so.0 pthread_cond_wait recv connect pthread_create send accept pthread_cond_signal pthread_cond_init pthread_mutex_unlock pthread_mutex_lock pthread_mutex_init _Jv_RegisterClasses close ...
通过`pthread_mutex_lock()`和`pthread_mutex_unlock()`函数,我们可以锁定和解锁互斥锁。 2. **条件变量(pthread_cond_wait, pthread_cond_signal)** 条件变量是另一种重要的线程同步工具,允许线程在满足特定...
int pthread_mutex_lock(pthread_mutex_t *mutex); ``` 4. **解锁:** 完成对共享资源的操作后,调用`pthread_mutex_unlock()`函数解锁,允许其他线程访问: ```cpp int pthread_mutex_unlock(pthread_mutex_t...
4. `pthread_mutex_t` 和 `pthread_mutex_init() / pthread_mutex_lock() / pthread_mutex_unlock() / pthread_mutex_destroy()`:互斥锁,用于保证同一时刻只有一个线程访问特定资源,防止数据竞争。 5. `pthread_...
pthread_mutex_lock(&mutex); // 临界区,只有获得锁的线程能到达这里 pthread_mutex_unlock(&mutex); ``` 3. `pthread_mutex_unlock()`: 释放互斥锁。只有持有锁的线程才能执行此操作,其他线程尝试解锁会返回错误...
在Pthreads中,我们使用`pthread_mutex_t`类型来表示互斥锁,并通过`pthread_mutex_init()`初始化,`pthread_mutex_lock()`获取锁,`pthread_mutex_unlock()`释放锁。 以下是一个简单的示例,展示了如何在Pthreads...
在Linux中,互斥量通过`pthread_mutex_t`类型表示,相关的API包括`pthread_mutex_init()`, `pthread_mutex_lock()`, `pthread_mutex_unlock()`和`pthread_mutex_destroy()`。让我们详细解释一下这些函数: 1. **...