小编puf*_*der的帖子

pthread_detach问题

直到最近,我的印象是,如果你在产生线程后"分离"一个线程,那么即使在"主"线程终止之后线程仍然存在.

但是一个小实验(如下所列)与我的观点相反.我希望分离的线程继续打印"从分离的线程说话",即使在主要终止之后,但这似乎并没有发生.该应用程序显然终止了......

"主要"问题返回0后,"分离"线程是否死亡?

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

void *func(void *data)
{
    while (1)
    {
        printf("Speaking from the detached thread...\n");
        sleep(5);
    }
    pthread_exit(NULL);
}

int main()
{
    pthread_t handle;
    if (!pthread_create(&handle, NULL, func, NULL))
    {
        printf("Thread create successfully !!!\n");
        if ( ! pthread_detach(handle) )
            printf("Thread detached successfully !!!\n");
    }

    sleep(5);
    printf("Main thread dying...\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c linux multithreading pthreads

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

切换机箱组件级别代码

我在cygwin windows上编写C语言.在完成了一些C编程并熟悉语言之后,我想深入了解编译器为我编写的代码做了些什么.

所以我写下了一个包含switch case语句的代码块,并使用以下方法将它们转换为汇编:

gcc -S foo.c  
Run Code Online (Sandbox Code Playgroud)

这是C源:

switch(i)
{
    case 1:
    {
        printf("Case 1\n");
        break;
    }
    case 2:
    {           printf("Case 2\n");
        break;
    }
    case 3:
    {
        printf("Case 3\n");
        break;
    }
    case 4:
    {
        printf("Case 4\n");
        break;
    }
    case 5:
    {
        printf("Case 5\n");
        break;
    }
    case 6:
    {
        printf("Case 6\n");
        break;
    }
    case 7:
    {
        printf("Case 7\n");
        break;
    }
    case 8:
    {
        printf("Case 8\n");
        break;
    }
    case 9:
    {
        printf("Case 9\n");
        break;
    }
    case 10:
    {
        printf("Case 10\n");
        break;
    } …
Run Code Online (Sandbox Code Playgroud)

c assembly gcc cygwin

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

用于linux的GUI开发工具的比较

我是GUI设计和开发领域的新手.我确实有一些先前的经验,但这是使用Visual Basic.

我想基于命令行应用程序在linux上开发一个相当全面的(虽然不是最先进的)GUI应用程序.我有.做了一些谷歌搜索,我发现主要有三种好的(或者也许是我的感觉)方法来实现这个目标:

  1. 以GLADE为设计师的GTK +库
  2. 用Qtdesigner作为设计师的Qt库
  3. Java与Netbeans一起摇摆

为了解决上述问题之一(或拒绝所有这些问题),我必须知道上面列表中每个项目的以下几个方面.这些方面按其优先顺序递减顺序为:

  1. 许可:我不能在这里掏出太多钱......
  2. 编程语言支持:我知道C/C++和非常少的Java.
  3. 易于学习/使用
  4. 灵活性和强大功能:如果我需要的大多数(如果不是全部)功能在核心库中可用,那将是非常好的.
  5. (缺乏)附加依赖性:推理与第4点相同
  6. 外观和感觉
  7. 支持的平台/可移植性(切换平台所需的工作量)

关于上述主题的任何想法都值得用黄金来衡量(我不想在一个月后意识到我为我的工作选择了错误的工具).有没有其他工具更适合我的目的,我不知道?

直落式答案最有帮助.

编辑:好的,所以我终于和Qt一起走了.仅仅因为它比GTK +更容易学习并且看起来更便携(对于我来说).

linux gtk user-interface swing qt

12
推荐指数
2
解决办法
9359
查看次数

哪个更适合Windows?pthreads还是CreateMutex?

我正在将我的应用程序从Linux移植到Windows.我对跨平台移植应用程序的精湛技术相当陌生.据我所知,Windows本身不支持POSIX线程实现.这是真的?我听说过一些针对windows(包装器或其他东西)的pthreads实现,最好是使用它们还是使用CreateMutex和windows提供的其他API?有人请.用两个世界的PRO和CON启发我.一些关于移植的杂项提示将与答案很好地配合.

提前致谢.

c linux windows posix pthreads

8
推荐指数
3
解决办法
6389
查看次数

接收来自N个客户端的响应,以响应UDP上的广播请求

我正在为特定类型的网络多媒体设备实现一种IP查找器.我想找出局域网中所有类型的活动设备,包括它们的IP地址和其他细节.

该设备有自己的设备发现方式.

它的工作原理如下:客户端通过UDP通过LAN发送广播请求.
目标端口号是固定的.
作为回应,LAN中理解此请求格式的所有服务器都将响应此请求,提供有关自身的信息.

我正在使用sendto()广播UDP请求消息.

现在我的问题是我不知道有多少设备(ieservers)会响应请求.

我需要多少次调用recvfrom()?
我什么时候才能知道我已经处理了所有设备的响应?
或者一般来说,recvfrom()是从多个服务器接收响应的正确选择吗?
有没有更好的(或者如果我错在这里是正确的)完成相同的方式?

我正在用C/C++编程,计划为Windows和Linux编写代码.
提前谢谢了.

编辑:所以在这里的所有网络编程向导的帮助下,我找到了解决我的问题的方法:)
select()对我来说就是这样的事情...非常
感谢所有花时间帮忙的人我

c c++ sockets udp broadcast

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

需要为函数添加前缀(void)

我最近遇到了一个相当不寻常的编码约定,其中对返回"void"的函数的调用以(void)为前缀.

例如

(void) MyFunction();  
Run Code Online (Sandbox Code Playgroud)

它与函数调用有什么不同:

MyFunction();  
Run Code Online (Sandbox Code Playgroud)

它有没有任何优势,或者它是另一个不必要但有某种编码约定?

c coding-style function void

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

如何调试以未处理的异常终止的程序?

我在Linux平台上用C++编程.

我的程序终止于此(未处理的)异常:

"在抛出'long'实例后终止调用"已中止

抛出异常的代码在try-catch块中,那为什么会发生这种情况?从函数返回时抛出异常.

我习惯于C编程,并且在C++方面经验很少(这是主要问题).我不知道如何调试这个问题.我不指望解决方案,而是指向调试此问题的方向/指针.

提前致谢.

c++ linux exception

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

使用gcc进行逐位移位的意外行为

我有一个这样的测试程序:

int main()
{
    unsigned n = 32;

    printf("ans << 32 = 0x%X\n", (~0x0U) << 32);
    printf("ans >> 32 = 0x%X\n", (~0x0U) >> 32);

    printf("ans << n(32) = 0x%X\n", (~0x0U) << n);
    printf("ans >> n(32) = 0x%X\n", (~0x0U) >> n);

    return 0;
}  
Run Code Online (Sandbox Code Playgroud)

它产生以下输出:

ans << 32 = 0x0  ... (1)  
ans >> 32 = 0x0  ... (2)  
ans << n(32) = 0xFFFFFFFF  ... (3)  
ans >> n(32) = 0xFFFFFFFF  ... (4)   
Run Code Online (Sandbox Code Playgroud)

我期望(1)和(3)是相同的,以及(2)和(4)是相同的.

使用gcc版本:gcc.real(Ubuntu 4.4.1-4ubuntu9)4.4.1

怎么了?

c linux gcc bit-shift

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

解码C代码的等效汇编代码

想要查看某些C代码的编译器输出(在汇编中),我在C中编写了一个简单的程序,并使用gcc生成了它的汇编文件.

代码是这样的:

#include <stdio.h>  

int main()  
{  
    int i = 0;

    if ( i == 0 )
    {
        printf("testing\n");
    }

    return 0;  
}  
Run Code Online (Sandbox Code Playgroud)

它的生成程序集在这里(只有主函数):

_main:  
pushl   %ebpz  
movl    %esp, %ebp  
subl    $24, %esp  
andl    $-16, %esp  
movl    $0, %eax  
addl    $15, %eax  
addl    $15, %eax  
shrl    $4, %eax  
sall    $4, %eax  
movl    %eax, -8(%ebp)  
movl    -8(%ebp), %eax  
call    __alloca  
call    ___main  
movl    $0, -4(%ebp)  
cmpl    $0, -4(%ebp)  
jne L2  
movl    $LC0, (%esp)  
call    _printf  
L2:  
movl    $0, %eax  
leave  
ret …
Run Code Online (Sandbox Code Playgroud)

c assembly gcc

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

为什么.bss显式地将全局变量初始化为零?

我正在生成mips反汇编以模拟它.我需要有大数据来处理它,但我不想拥有大的汇编文件,所以我想要处理一个大的未初始化的数组(然后可能在我的模拟器中初始化它...).所以我需要这个数组是全局的.并且全局变量似乎放在.bss部分,以便在实际访问页面时进行初始化.问题是在我的二进制文件中,数组在.bss部分,但显式填充为零...如果我正确理解我在互联网上找到的内容,这不是预期的行为......有没有办法说编译器(或链接器,或者加载器......我不明白哪一个为此做了什么)在这个数组中没有真正归零?或者,我们可以在编译时有一个选项,还是一个C指令,说我们不希望这个数组用0初始化?(我尝试使用属性更改数组部分,但仍使用0初始化).

顺便说一句,我用objdump生成我的反汇编文件,它通常跳过零块,但我真的需要反汇编其他的零块,所以我使用"-z"选项.

我真正不明白的是,无论我看到的是什么,都说.bss部分并没有真正把二进制文件中的零写入...

c assembly gcc mips

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

更好的语言开发GUI?

我需要开发一个适用于Windows和Linux的GUI,用于以C++编写并仅在Linux上运行的后端.

我知道如果我选择Java或Python,我需要使用包装器(如Swig),但是再次知道他们会产生比C++更好的GUI.

你会建议什么是更好的选择(对于新手)?

c++ python java user-interface

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