小编Kar*_*ick的帖子

uint16_t 会提升为 int 吗?将 uint16_t 类型转换为 uint32_t 安全吗?

uint32_t a = 10;
uint16_t b = 0;

if (a > b)
{
   printf("a > b\n");
}
Run Code Online (Sandbox Code Playgroud)

我期望它b会被提升int,并且编译器会抱怨比较有符号和无符号。但编译器没有提出任何警告。

当我更改 if (a > b)if (a > (b * 10))编译器时说

warning: comparison between signed and unsigned
Run Code Online (Sandbox Code Playgroud)

为什么会这样呢?

将其类型转换为 uint32_t 是否安全?

if (a > (uint32_t)(b * 10))
Run Code Online (Sandbox Code Playgroud)

c c++ casting type-conversion integer-promotion

7
推荐指数
1
解决办法
873
查看次数

什么时候为c中的变量分配内存?

什么时候为c中的变量分配内存?它是在声明或初始化期间发生的吗?这是根据范围或存储类别而有所不同吗?

例如:

int i; <<<<<<<< memory gets allocated here?
i=10;  <<<<<<<< memory gets allocated here?
Run Code Online (Sandbox Code Playgroud)

我想,它会在声明中自行分配.如果我错了,请更正我.

c variables declaration

3
推荐指数
2
解决办法
652
查看次数

在c中声明期间初始化指针

以下是如何工作的?

char *str="string";
printf("str is %s\n",str);
Run Code Online (Sandbox Code Playgroud)

但是下面的一个给出了分段错误

int *i=3;
printf("int is %d\n",*i);
Run Code Online (Sandbox Code Playgroud)

c

2
推荐指数
1
解决办法
75
查看次数

我们可以使用动态扩展磁盘在Azure中创建VM吗?

我使用动态扩展的VHD选项在hyperv中创建了一个VM.现在我已经将该VHD导出到azure云并在azure中创建了一个VM.我的VM无法正常启动.是否建议使用动态扩展VHD在Azure中创建VM?

vhd azure azure-virtual-machine

2
推荐指数
1
解决办法
1728
查看次数

使用 C 中的互斥锁使用 2 个线程打印奇数和偶数

程序中的两个线程交替打印偶数和奇数,直到 100。我试过这个,它奏效了。有没有办法访问main内部共享数据的值,当值达到100时终止2个线程

#include<stdio.h>
#include<pthread.h>

pthread_t tid[2];
unsigned int shared_data = 0;
pthread_mutex_t mutex;
unsigned int rc;
//prototypes for callback functions

void* PrintEvenNos(void*);
void* PrintOddNos(void*);

void main(void)
{
    pthread_create(&tid[0],0,&PrintEvenNos,0)
    pthread_create(&tid[1],0,&PrintOddNos,0);
    sleep(3);

    pthread_join(tid[0],NULL);
    pthread_join(tid[1],NULL);
}

void* PrintEvenNos(void *ptr)
{
    pthread_mutex_lock(&mutex);
    do
    {
       if(shared_data%2 == 0)
       {
         printf("Even:%d\n",shared_data);
         shared_data++;
       } else {
          rc=pthread_mutex_unlock(&mutex);//if number is odd, do not print, release mutex
       }
    } while(shared_data <= 100);
}

void* PrintOddNos(void* ptr1)
{
    rc = pthread_mutex_lock(&mutex);
    do
    {
       if(shared_data%2 != 0)
       {
          printf("odd:%d\n",shared_data);
          shared_data++;
       } …
Run Code Online (Sandbox Code Playgroud)

linux mutex pthreads

1
推荐指数
1
解决办法
3万
查看次数

作为引用传递的变量的值在线程中更改

我写了这个小程序来理解pthread_create和pthread_join,但我不明白为什么data在thread_join之后变量的值会被改变.它在调用pthread函数后打印为0.

#include <pthread.h>
#include <stdio.h>
void* compute_prime (void* arg)
{
        int n = *((int*) arg);
        printf("Argument passed is %d\n",n);
        return (void *)n;
}
int main ()
{
        pthread_t thread;
        int data = 5000;
        int value=0;

        pthread_create (&thread, NULL, &compute_prime, &data);
        pthread_join (thread, (void*) &value);
        printf("The number is %d and return value is %d.\n", data, value);
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是

Argument passed is 5000
The number is 0 and return value is 5000.
Run Code Online (Sandbox Code Playgroud)

c pthreads pthread-join

1
推荐指数
1
解决办法
52
查看次数

使用 GnuTLS 构建时 libcurl 线程安全吗

libcurl 线程安全的要求之一是底层 SSL 库应该是线程安全的。

根据 GnuTLS 的文档,它的设计是线程安全的。

GnuTLS 库在设计上是线程安全的,这意味着只要单个线程访问单个对象,该库的对象(例如 TLS 会话)就可以安全地跨线程划分。这足以支持每个线程处理多个会话的服务器。对对象(例如持有结构的凭证)的只读访问也是线程安全的。

然而,有一些用例需要注意。

gnutls_session_t 对象也可以由两个线程共享,一个发送,另一个接收。但是,必须注意以下用例:

  • TLS 1.2 或更早版本中的重新握手过程必须仅在单个线程中处理,并且其他线程不得执行任何操作。

  • 在此操作模式下不能安全地使用标志 GNUTLS_AUTO_REAUTH。

  • 当线程接收或写入时,不得执行任何其他可能发送或接收数据的操作,例如密钥更新(参见 gnutls_session_key_update)。

  • 会话的终止应该由处于活动状态的单个线程来处理,或者由发送者线程使用 gnutls_bye 和 GNUTLS_SHUT_WR 以及接收线程等待返回值零(或在某些不响应的服务器上超时)来处理。

  • 在并行操作期间不应依赖函数 gnutls_transport_set_errno 和 gnutls_record_get_direction。

libcurl 是否能够处理上述用例?

c curl libcurl gnutls

1
推荐指数
1
解决办法
255
查看次数