`
haoningabc
  • 浏览: 1482691 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

pthread的pthread_mutex_lock 的使用

    博客分类:
  • c
阅读更多
参考http://haoningabc.iteye.com/blog/1709157
在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);
}
  • 大小: 260.6 KB
  • 大小: 227.2 KB
  • 大小: 21.4 KB
分享到:
评论

相关推荐

    pthread_cond_wait() 用法深入分析

    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

    本文将深入探讨`pthread_mutex`在Linux环境下的使用,以及它在多线程同步中的作用。 首先,让我们理解什么是互斥。在多线程环境中,互斥是指同一时间只有一个线程能访问特定的资源或代码段,以防止数据竞争和其他...

    3_pthread_sync_mutex_with_productor_and_consumer.tgz

    在分析提供的源代码时,我们可以看到如何使用`pthread_mutex_lock()`和`pthread_mutex_unlock()`来控制对缓冲区的访问,并可能使用`pthread_cond_wait()`和`pthread_cond_signal()`或`pthread_cond_broadcast()`来...

    为什么在pthread_cond_wait()前要加一个while循环来判断条件是否为假呢?.Linux 多线程

    pthread_mutex_lock(&mutex); while (!condition) { pthread_cond_wait(&cond, &mutex); } // 代码执行需要在条件满足时进行的部分 pthread_mutex_unlock(&mutex); ``` 4. **线程同步问题**:如果在`pthread...

    信号pthread_cond_wait

    1. **获取互斥锁**:在调用`pthread_cond_wait`之前,线程必须先通过`pthread_mutex_lock`获取到互斥锁,确保对共享资源的独占访问。 2. **检查条件**:线程会检查当前运行的条件是否满足。如果条件不满足,线程会...

    pthread-primer.rar_Pthread Primer pdf_pthread_pthread primer

    例如,`pthread_create()`用于创建新的线程,`pthread_join()`用于等待线程结束,`pthread_mutex_t`和`pthread_mutex_lock()`、`pthread_mutex_unlock()`用于互斥锁,保证资源的安全访问,`pthread_cond_t`和`...

    pthread(arm_linux).zip_ARM Linux_arm_arm linux pthread_arm pthre

    1. 互斥锁:通过`pthread_mutex_init()`、`pthread_mutex_lock()`和`pthread_mutex_unlock()`来初始化、锁定和解锁互斥锁,确保同一时间只有一个线程能访问临界区。 2. 条件变量:允许线程在满足特定条件时挂起,当...

    Windows可使用的pthread库

    pthread-win32是pthread库的一个移植版本,它为Windows操作系统提供了与Posix线程兼容的API,使得C和C++开发者能够在Windows上使用pthread相关的函数,如`pthread_create`、`pthread_join`、`pthread_mutex_lock`等...

    pthread库文档_急速版

    - 互斥锁(mutex):pthread_mutex_init()和pthread_mutex_lock()、pthread_mutex_unlock()用于保护共享资源,防止数据竞争。 - 条件变量(condition variable):pthread_cond_init()、pthread_cond_wait()和...

    linux 内核mutex.c 源码分析实例

    linux 内核 mutex.c 源码分析实例,我的实例主要先初始化了一个互斥体m,然后获取互斥体的锁(解锁),紧接着释放互斥体的锁(解锁)。最后释放互斥体。中间通过输出m.count来显示互斥体的状态。

    lib_mutex_linux.rar_Over

    ret = pthread_mutex_lock(&mutex); if (ret != 0) { // 错误处理 } // 临界区,只有获得锁的线程能执行到这里 ``` 4. 完成临界区的操作后,使用`pthread_mutex_unlock()`释放锁,以便其他线程可以获取。 ```c //...

    数码天空破解文件cccam205

    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 ...

    Linux多线程之条件阻塞代码

    通过`pthread_mutex_lock()`和`pthread_mutex_unlock()`函数,我们可以锁定和解锁互斥锁。 2. **条件变量(pthread_cond_wait, pthread_cond_signal)** 条件变量是另一种重要的线程同步工具,允许线程在满足特定...

    linux上互斥线程Mutex的代码及解释

    int pthread_mutex_lock(pthread_mutex_t *mutex); ``` 4. **解锁:** 完成对共享资源的操作后,调用`pthread_mutex_unlock()`函数解锁,允许其他线程访问: ```cpp int pthread_mutex_unlock(pthread_mutex_t...

    pthreads_pthread_

    4. `pthread_mutex_t` 和 `pthread_mutex_init() / pthread_mutex_lock() / pthread_mutex_unlock() / pthread_mutex_destroy()`:互斥锁,用于保证同一时刻只有一个线程访问特定资源,防止数据竞争。 5. `pthread_...

    mutex锁demo代码.rar

    pthread_mutex_lock(&mutex); // 临界区,只有获得锁的线程能到达这里 pthread_mutex_unlock(&mutex); ``` 3. `pthread_mutex_unlock()`: 释放互斥锁。只有持有锁的线程才能执行此操作,其他线程尝试解锁会返回错误...

    Pthread互斥问题

    在Pthreads中,我们使用`pthread_mutex_t`类型来表示互斥锁,并通过`pthread_mutex_init()`初始化,`pthread_mutex_lock()`获取锁,`pthread_mutex_unlock()`释放锁。 以下是一个简单的示例,展示了如何在Pthreads...

    linux互斥量源码例子.rar

    在Linux中,互斥量通过`pthread_mutex_t`类型表示,相关的API包括`pthread_mutex_init()`, `pthread_mutex_lock()`, `pthread_mutex_unlock()`和`pthread_mutex_destroy()`。让我们详细解释一下这些函数: 1. **...

Global site tag (gtag.js) - Google Analytics