【发布时间】:2020-03-05 11:37:17
【问题描述】:
我正在编写 2 个类似的代码,用于使用互斥锁和信号量从给定的数字集中打印奇数和偶数。这两个代码都可以正常工作。
但是,在使用互斥锁时,即使我不声明pthread_mutex_init 函数,程序仍然可以毫无问题地执行。但信号量并非如此。对于这种情况,我必须在 main() 中声明sem_init,否则程序执行会卡在sem_wait()(调试后发现)。
那么,在互斥锁的情况下,即使没有声明init(),程序如何执行?
作为参考,我附上信号量代码。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
sem_t mutex;
pthread_t tid[2];
unsigned int shared_data[] = {23,45,67,44,56,78,91,102};
unsigned int rc;
int len=(sizeof(shared_data)/sizeof(shared_data[0]));
int i=0;
void *even(void *arg) {
rc = sem_wait(&mutex);
int temp = rc;
if(rc)
printf("Semaphore failed\n");
do{
if(shared_data[i] %2 == 0) {
printf("Even: %d\n",shared_data[i]);
i++;
}
else
rc = sem_post(&mutex);
}while(i<len);
}
void *odd(void *arg) {
rc = sem_wait(&mutex);
if(rc)
printf("Semaphore failed\n");
do {
if(shared_data[i] %2 != 0) {
printf("Odd: %d\n",shared_data[i]);
i++;
}
else
rc = sem_post(&mutex);
}while(i<len);
}
int main() {
sem_init(&mutex, 0,1);
pthread_create(&tid[0], 0, &even, 0);
pthread_create(&tid[1], 0, &odd, 0);
pthread_join(tid[0],NULL);
pthread_join(tid[1],NULL);
sem_destroy(&mutex);
return 0;
}
编辑:同时附加互斥锁代码。
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
pthread_t tid[2];
unsigned int shared_data []= {23,45,67,44,56,78,91,102};
pthread_mutex_t mutex;
unsigned int rc;
int len=(sizeof(shared_data)/sizeof(shared_data[0]));
int i=0;
void* PrintEvenNos(void *ptr)
{
rc = pthread_mutex_lock(&mutex);
if(rc)
printf("Mutex lock has failed\n");
do
{
if(shared_data[i]%2 == 0)
{
printf("Even:%d\n",shared_data[i]);
i++;
} else {
rc=pthread_mutex_unlock(&mutex);
}
} while(i<len);
}
void* PrintOddNos(void* ptr1)
{
rc = pthread_mutex_lock(&mutex);
if(rc)
printf("Mutex lock has failed\n");
do
{
if(shared_data[i]%2 != 0)
{
printf("Odd:%d\n",shared_data[i]);
i++;
} else {
rc=pthread_mutex_unlock(&mutex);
}
} while(i<len);
}
void main(void)
{
pthread_create(&tid[0],0,PrintEvenNos,0);
pthread_create(&tid[1],0,PrintOddNos,0);
pthread_join(tid[0],NULL);
pthread_join(tid[1],NULL);
}
【问题讨论】:
-
因为您的变量都是全局变量,所以它们将被零初始化。对于
pthread_mutex_t,这可能恰好是您本地系统上的正确方式,但对于sem_t则不然。一般来说,总是明确地“初始化”你的变量,不管是全局的还是非全局的。 -
@attyman17 使用
pthread_mutex_init的代码在哪里让你惊讶? -
@Landstalker 我已经添加了。
-
@battyman17 之所以起作用,是因为编译器分配的初始化值与您使用 pthread_mutex_init 函数显式分配的值一致。
-
@SolomonSlow 程序不再需要显式初始化静态分配的
pthread_mutex_t对象。???在哪里?每POSIXpthread_mutex_init():“在默认互斥属性合适的情况下,宏PTHREAD_MUTEX_INITIALIZER可用于初始化互斥锁。效果应等同于通过调用pthread_mutex_init()动态初始化,参数attr指定为NULL,但不执行错误检查。”
标签: c multithreading mutex semaphore