您需要调用pthread_mutex_lock来保护互斥锁,如下所示:
pthread_mutex_lock(&mutex);
一旦你这样做了,在该线程中调用
pthread_mutex_lock(mutex)
的任何其他调用都不会返回,直到你在该线程中调用了
pthread_mutex_unlock
。因此,如果你尝试调用
pthread_create
,你将能够创建一个新线程,而该线程将能够(错误地)使用共享资源。你应该从你的
fooAPI
函数中调用
pthread_mutex_lock
,这将导致函数等待直到共享资源可用。
所以你会有类似这样的代码:
#include <pthread.h>
#include <stdio.h>
int sharedResource = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void* fooAPI(void* param)
{
pthread_mutex_lock(&mutex);
printf("Changing the shared resource now.\n");
sharedResource = 42;
pthread_mutex_unlock(&mutex);
return 0;
}
int main()
{
pthread_t thread;
pthread_mutex_lock(&mutex);
pthread_create(&thread, NULL, fooAPI, NULL);
sleep(1);
pthread_mutex_unlock(&mutex);
pthread_mutex_lock(&mutex);
printf("%d\n", sharedResource);
pthread_mutex_unlock(&mutex);
}
编辑:跨进程使用资源遵循相同的基本方法,但需要将内存映射到其他进程中。这里是使用shmem的示例:
#include <stdio.h>
#include <unistd.h>
#include <sys/file.h>
#include <sys/mman.h>
#include <sys/wait.h>
struct shared {
pthread_mutex_t mutex;
int sharedResource;
};
int main()
{
int fd = shm_open("/foo", O_CREAT | O_TRUNC | O_RDWR, 0600);
ftruncate(fd, sizeof(struct shared));
struct shared *p = (struct shared*)mmap(0, sizeof(struct shared),
PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
p->sharedResource = 0;
pthread_mutexattr_t shared;
pthread_mutexattr_init(&shared);
pthread_mutexattr_setpshared(&shared, PTHREAD_PROCESS_SHARED);
pthread_mutex_init(&(p->mutex), &shared);
int i;
for (i = 0; i < 100; i++) {
pthread_mutex_lock(&(p->mutex));
printf("%d\n", p->sharedResource);
pthread_mutex_unlock(&(p->mutex));
sleep(1);
}
munmap(p, sizeof(struct shared*));
shm_unlink("/foo");
}
编写程序更改p->sharedResource的过程留给读者自己完成。 :-)
顺便提醒一下,mutex必须具有PTHREAD_PROCESS_SHARED属性设置,以便pthread可以跨进程工作。
pthread_mutex_lock()
锁定线程”之类的内容,以使问题更易搜索并且具有更清晰的开头? - Gabriel Staplesmtx_lock()
vspthread_mutex_lock()
- Gabriel Staples