首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

pthread_join不起作用,互斥在C中也不起作用

pthread_join是一个用于等待指定线程结束的函数。它的原型如下:

代码语言:txt
复制
int pthread_join(pthread_t thread, void **retval);

其中,thread是要等待的线程的标识符,retval是一个指向指针的指针,用于获取线程的返回值。

如果pthread_join不起作用,可能有以下几个可能的原因:

  1. 线程标识符错误:请确保传递给pthread_join的线程标识符是正确的,即确保它是有效的线程标识符。
  2. 线程已经被分离:如果线程已经被分离,那么它的资源会在结束时自动释放,无法再使用pthread_join等待它结束。在创建线程时,可以使用pthread_detach函数将线程设置为分离状态,或者在创建线程时设置线程属性为分离状态。
  3. 线程已经结束:如果线程已经结束,那么pthread_join将立即返回,并且不会等待。可以通过在线程函数中使用pthread_exit显式地退出线程,或者让线程函数自然结束来确保线程不会提前结束。
  4. 线程没有被创建:如果pthread_join在指定的线程还没有被创建时调用,它将返回EINVAL错误。请确保在调用pthread_join之前,已经创建了要等待的线程。

关于互斥在C中不起作用的问题,可能有以下几个可能的原因:

  1. 互斥锁未正确初始化:在使用互斥锁之前,需要使用pthread_mutex_init函数对互斥锁进行初始化。请确保在使用互斥锁之前,已经正确地初始化了互斥锁。
  2. 互斥锁未正确加锁和解锁:在使用互斥锁保护临界区代码时,需要使用pthread_mutex_lock函数对互斥锁进行加锁,使用pthread_mutex_unlock函数对互斥锁进行解锁。请确保在进入临界区之前加锁,在离开临界区之后解锁。
  3. 互斥锁未正确销毁:在不再需要使用互斥锁时,需要使用pthread_mutex_destroy函数对互斥锁进行销毁。请确保在不再使用互斥锁时,已经正确地销毁了互斥锁。

以上是可能导致pthread_join和互斥在C中不起作用的一些常见原因。如果问题仍然存在,可能需要进一步检查代码逻辑和调试。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

List.append() Python 不起作用,该怎么解决?

Python ,我们通常使用 List.append() 方法向列表末尾添加元素。然而,某些情况下,你可能会遇到 List.append() 方法不起作用的问题。...变量重新赋值 Python ,列表是可变对象,也就是说,它们可以通过引用进行修改。...由于 my_list 和 new_list 引用同一个列表对象,因此对 new_list 的修改会反映在 my_list 上。2....列表作为函数参数另一个导致 List.append() 方法不起作用的常见情况是将列表作为函数的参数传递。 Python ,函数参数传递是通过对象引用实现的。...结论List.append() 方法 Python 通常是一个方便且常用的方法,用于向列表末尾添加元素。然而,当遇到某些情况时,它可能不起作用

2.3K20

Posix多线程编程

而运行于一个进程的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间远远小于进程间切换所需要的时间。...当然,数据的共享带来其他一些问题,有的变量不能同时被两个线程所修改,有的子程序声明为static的数据更有可能给多线程程序带来灾难性的打击,这些正是编写多线程程序时最需要注意的地方。...void ** status:如果不为NULL,那么线程的返回值存储status指向的空间中(这就是为什么status是二级指针的原因!这种才参数称为“值-结果”参数)。...(pid, NULL); 35 pthread_join(pid1, NULL); 36 return 0; 37} 注意,gcc,默认是不包含线程相关的库的,所以在编译这个程序操作如下是会产生错误的...图4-3-27 创建线程的实验结果 pthread.c创建了2个线程,并在线程实现打印功能,最终调用pthread_join等待子线程运行结束,一并退出。

78340

多线程编程C语言版

运行于一个进程的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间远远小于进程间切换所需要的时间。...线程退出与等待 Demo1我们用到了pthread_join这个函数 #include int pthread_join(pthread_t thread, void **retval...Linux线程属性总结文章参考: https://blog.csdn.net/nkguohao/article/details/38796475 线程的同步互斥 开头说道,多线程的程序,多个线程共享堆栈空间...,那么就会存在问题 互斥多线程的程序,多个线程共享临界区资源,那么就会有竞争问题,互斥锁mutex是用来保护线程间共享的全局变量安全的一种机制, 保证多线程某一时刻只允许某一个线程对临界区的访问.../main 字符指针数组的内容是:str2 str1 读写锁 读写锁与互斥量类似,不过读写锁允许更改的并行性,叫共享互斥锁。

3.6K31

Linux系统编程-(pthread)线程通信(互斥锁)

这篇文章介绍Linux下线程同步与互斥机制–互斥锁,多线程并发的时候,都会出现多个消费者取数据的情况,这种时候数据都需要进行保护,比如: 火车票售票系统、汽车票售票系统一样,总票数是固定的,但是购票的终端非常多...一个时刻只能有一个线程掌握某个互斥锁,拥有上锁状态的线程才能够对共享资源进行操作。若其他线程希望上锁一个已经上锁了的互斥锁,则该线程就会挂起,直到上锁的线程释放掉互斥锁为止。 1....互斥锁介绍 在编程,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。...如果当前线程拥有参数mutex 所指定的互斥体,该调用将该互斥体解锁。 如果解锁成功,将返回0. 说明: 对同一个锁多次解锁没有叠加效果,如果锁是上锁状态,那么多次解锁只有一次有效。 3....等待线程的介绍*/ pthread_join(thread_id,NULL); pthread_join(thread_id2,NULL); //销毁互斥锁 pthread_mutex_destroy

2.1K10

详解Linux多线程互斥锁、读写锁、自旋锁、条件变量、信号量

---- Hello、Hello大家好,我是木荣,今天我们继续来聊一聊Linux多线程编程的重要知识点,详细谈谈多线程同步和互斥机制。...大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。 互斥多任务操作系统,同时运行的多个任务可能都需要使用同一种资源。...原子性:互斥锁是一个原子操作,操作系统保证如果一个线程锁定了一个互斥锁,那么其他线程同一时间不会成功锁定这个互斥锁 唯一性:如果一个线程锁定了一个互斥锁,它解除锁之前,其他线程不可以锁定这个互斥锁...return 0; } 读写锁 读写锁允许更高的并行性,叫共享互斥锁。...linux的自旋锁用结构体spinlock_t 表示,定义include/linux/spinlock_type.h。

3.1K20

linux实现线程同步的6种方法

); return 0; } 运行结果如下: # gcc no_lock_demo.c -o no_lock_demo.out -pthread # ....嵌套锁(PTHREAD_MUTEX_RECURSIVE):该锁允许一个线程释放锁之前多次对它加锁而不发生死锁;其他线程要获得这个锁,则当前锁的拥有者必须执行多次解锁操作;对一个已经被其他线程加锁的嵌套锁解锁...); return 0; } 条件变量 条件变量可以让调用线程满足特定条件的情况下运行,不满足条件时阻塞等待被唤醒,必须与互斥锁搭配使用。...mutex // 从条件变量cond唤出一个线程,令其重新获得原先的互斥锁 // 被唤出的线程此刻将从pthread_cond_wait函数返回,但如果该线程无法获得原先的锁,则会继续阻塞在加锁上...读写锁叫做共享-独占锁,当读写锁以读模式锁住时,它是以共享模式锁住的,当它以写模式锁住时,它是以独占模式锁住的,读读共享,读写互斥

80020

Linux下c语言多线程编程

两条线程是同时随机交叉着运行的。 单核CPU就是这样子随机分配时间片给线程一直交换着执行,这叫并发执行。...+s2); return 0; } 例子5 上一个例子的代码重复率太高,我们对其优化,加入了结构体,只用了同一个函数。...因为第一条线程读s并s++的时候,第二条线程会来读,可能在第一条线程进行加之前读可能在加之后读,所以我们会丢失一些s++,所以每次运行出来的结果都不一样。...,写NULL就可以了,代表默认的快速互斥锁。...但通过“锁”就将资源的访问变成互斥操作,而后与时间有关的错误不会再产生了。 访问共享资源前加锁,访问结束后立即解锁。锁的“粒度”应越小越好。

8.7K20

futex函数_UNIXLINUX

首先,同步的进程间通过mmap共享一段内存,futex变量就位于这段共享 的内存且操作是原子的,当进程尝试进入互斥区或者退出互斥区的时候,先去查看共享内存的futex变量,如果没有竞争发生,则只修改...POSIX标准定义了三种线程同步机制: Mutexes(互斥量), Condition Variables(条件变量)和POSIX Semaphores(信号量) 。...我们假设一下,如果抛开这个语义,如果允许semaphore值为负,则可以sem_post()的时候,实现futex机制。 2....是因为pthread_join(); Glibcpthread_join也是用futex系统调用实现的。...我们使用过程要知道他们的共性,得了解它们之间的差异。这样才能更好的理解多线程场景,写出更高质量的多线程程序。

51420

Linux线程-生产消费模型和线程池

,为了避免交易产所的数据混乱,我们需要将该临界资源用互斥锁保护起来。...那当生产者生产的数据将空间塞满后,生产者再频繁访问交易场所会是没有实际的效用;如果让消费者一直消费,那么当容器当中的数据被消费完后,消费者再频繁的访问交易产所会是没有实际的效用 虽然这样没什么问题...但此时该线程是拿着锁的,为了避免死锁问题,调用pthread_cond_wait函数时就需要传入当前线程手中的互斥锁,此时当该线程被挂起时就会自动释放手中的互斥锁,而当该线程被唤醒时又会自动获取到该互斥锁...便于例程中直接使用对象进行调用函数进行访问任务队列 多线程访问任务队列时需要维护同步与互斥,所以需要使用条件变量与互斥锁接口,为了更方便在静态例程函数中使用条件变量和互斥锁,我们需要进一步封装接口便于调用...,并提供一个访问它的全局访问点,该实例被所有程序模块共享 比如: 某个服务器程序,该服务器的配置信息存放在一个文件,这些配置数据由一个单例对象统一读取,然后服务进程的其他对象再通过这个单例对象获取这些配置信息

3.2K20

线程(二)线程互斥+线程同步

代码必须要有互斥行为:当代码进入临界区执行时,不允许其他线程进入该临界区。 如果多个线程同时要求执行临界区的代码,并且临界区没有线程执行,那么只能允许一个线程进入该临界区。...如果线程不在临界区执行,那么该线程不能阻止其他线程进入临界区。 要做到这三点,本质上就是需要一把锁。Linux上提供的这把锁叫互斥量 ?...一个函数重入的情况下,运行结果不会出现任何不同或者任何问题,则该函数被称为可重入函数,否则,是不可重入函数。...形成死锁的四个必要条件 互斥条件:一个资源每次只能被一个执行流使用 请求与保持条件:一个执行流因请求资源而阻塞时,对已获得的资源保持不放 不剥夺条件:一个执行流已获得的资源,末使用完之前,不能强行剥夺...,它可能发现在其它线程改变状态之前,它什么做不了 例如一个线程访问队列时,发现队列为空,它只能等待,只到其它线程将一个节点添加到队列

1.2K10

【Pthreads学习笔记】基本使用

(thread_id, NULL); } 在上面的代码, 程序最后加上了 pthread_join 函数, 用来完成线程间的同步, 即主线程等待指定的线程(在上面的代码是 thread_id 对应的线程...p_result 函数为了使线程执行完, 我们还可以访问到变量 m 的数据, m 的内存采用动态分配的方式, 如果静态分配, 即如 char m[3] 的形式, 那么函数执行完就会清空 m 的值,...的 创建线程时指定线程的 detach 属性: pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); 通过子线程调用 pthread_detach...(pthread_self()); 主线程调用 pthread_detach(thread_id);(非阻塞, 执行完会立即会返回), 通过上面的方式将线程设为 detached, 线程运行结束后会自动释放所有资源..., 一定要先初始化该互斥锁 释放互斥锁的线程必须是获得互斥锁的那个线程 当 destroy 互斥锁的时候, 不该有线程还在使用这个互斥锁 属性 动态创建互斥锁时, 我们可以传入一个锁属性变量 pthread_mutexattr_t

63120

Linux应用开发【第五章】线程编程应用开发

获取线程号 #include pthread_t pthread_self(void); 成功:返回线程号 程序,可以通过函数pthread_self,来返回当前线程的线程号...pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg); 成功:返回0 ​ 传统的程序...例程代码的27行,直接将int类型的变量强制转化为void *进行传递(针对不同位数机器,指针对其字数不同,需要int转化为long转指针,否则可能会发生警告),在线程处理回调函数,直接将void...当然初始化互斥可以调用宏来快速初始化: pthread_mutex_t mutex = PTHREAD_MUTEX_INITALIZER; 互斥锁加锁(阻塞)/解锁 #include <pthread.h...使用互斥锁的时候,尤其要注意使用pthread_cancel函数,防止发生死锁现象!

1.4K20

【Linux系统编程】线程之间的同步与协调

互斥互斥锁(Mutex)是一种用于多线程编程的同步机制,用于保护共享资源,防止多个线程同时访问或修改同一资源而导致数据不一致或冲突。...使用互斥锁时,需要在访问共享资源之前对互斥锁进行加锁操作,访问完毕后再进行解锁操作,这样可以保证同一时间只有一个线程可以访问该资源。互斥锁可以防止多个线程同时修改共享资源,保证了线程安全性。...添加一个全局互斥锁,主线程初始化互斥锁,然后操作完成后销毁互斥锁。 每次对counter进行处理的时候都先加锁,操作完成之后再解锁。 重新编译运行程序,可以得到想要的结果了。...当线程需要访问共享资源时,首先会尝试对信号量进行P操作(称为申请操作),该操作会将信号量的计数器减1。...当线程使用完共享资源后,会对信号量进行V操作(称为释放操作),该操作会将信号量的计数器加1,表示释放了一个资源。 添加一个全局的信号量,主线程初始化信号量,并在操作完成后销毁信号量。

20710

linux c++进程间通信_c++多线程通信

按照POSIX 1003.1c 标准编写的程序与Linuxthread 库相链接即可支持Linux平台上的多线程,程序需包含头文件pthread. h,在编译链接时使用命令: gcc -D -REENTRANT...-lpthread xxx. c   其中-REENTRANT宏使得相关库函数(如stdio.h、errno.h函数) 是可重入的、线程安全的(thread-safe),-lpthread则意味着链接库目录下的...线程IDpthread_create调用时回返给创建线程的调用者;一个线程可以创建后使用pthread_self()调用获取自己的线程ID: pthread_self (void) ;   线程退出...Linux下可以通过pthread_mutex_t 定义互斥体机制完成多线程的互斥操作,该机制的作用是对某个需要互斥的部分,进入时先得到互斥体,如果没有得到互斥体,表明互斥部分被其它线程拥有,此时欲获取互斥体的线程阻塞...头文件semaphore.h 定义的信号量则完成了互斥体和条件变量的封装,按照多线程程序设计访问控制机制,控制对资源的同步访问,提供程序设计人员更方便的调用接口。

3.8K10

Unix-Linux编程实践教程-chapter14-thread

第14章 线程机制:并发函数的使用 执行线路即为程序的控制流程.pthreads的线程库允许程序同一时刻运行多个函数 同时执行的各函数都拥有自己的局部变量,但共享所有的全局变量和动态分配的数据空间 当线程共享变量时...,必须保证他们不会发生共享冲突.线程使用互斥锁保证某一时刻只有 一个线程在对共享变量访问 线程间通过条件变量来互相通知和同步数据.一个线程挂起并等待着条件变量按照某种特定 方式变化,而另一个线程则发出信号使得条件变量发生变化...线程需要使用互斥量来避免对于共享资源操作函数的访问冲突.非重入的函数必须按照 这种方式进行保护 进程间可以通过管道 socket 信号 退出/等待以及运行环境来进行会话.线程因为是 一个单独的进程运行...,共享全局变量,因此线程可以通过设置和读取这些全局变量来 进行通信,对共享内存的访问,既有用危险 code /* * test_mutex.c */ #include #include...*arg = a; for (int i = 0; i < times; i++) { arg->count++; } } /* * test_mutex.c

43020

多线程锁有几种类型_进程同步和互斥概念

多任务操作系统,同时运行的多个任务可能: 都需要访问/使用同一种资源; 多个任务之间有依赖关系,某个任务的运行依赖于另一个任务。...二、互斥锁(同步) 多任务操作系统,同时运行的多个任务可能都需要使用同一种资源。...这个过程有点类似于,公司部门里,我使用着打印机打印东西的同时(还没有打印完),别人刚好在此刻使用打印机打印东西,如果不做任何处理的话,打印出来的东西肯定是错乱的。...【互斥锁的操作流程如下】: 1. 访问共享资源后临界区域前,对互斥锁进行加锁; 2. 访问完成后释放互斥锁导上的锁。访问完成后释放互斥锁导上的锁; 3....虚假唤醒linux的多处理器系统/程序接收到信号时可能回发生。Windows系统和JAVA虚拟机上存在。

1.1K40
领券